gcc

K&Rを読もう(9) 1.9 文字配列

GCC

C言語で凶悪なのが、文字配列。というか、文字列自体あんまり得意じゃない。今回は、配列で行の取得。スクリプト言語に慣れてると固定長配列は凄くキツイ。テキストファイルについての考察。 行はは文字の連続と改行で表されて、 ファイルは行の連続と、EOF…

K&Rを読もう(8) 1.7 図解Schemerの再帰脳

GCC

Schemerは再帰が無いと生きていけない。再帰で考えた方がシンプルに問題が解ける。K&R 1.7のテーマはべき乗。丁度良い題材なので、Schemerの再帰脳を復習しておこう。 Schemerは再帰で考える。 2の10乗をやろう。2の10乗。つまり、2を10回掛けるってこと。展…

K&Rを読もう(7) 演習 1-14 またまたヒストグラム表示

GCC

さて、問題を解こう。またまたヒストグラム。 演習 1-14 今度は文字の頻度。 #include <stdio.h> #include <stdlib.h> void hist_iter(int count[], int start, int end) { int i, j; for(i = start; i <= end; i++) { printf("%c(%2x) : %2d ", i , i, count[i]); for (j = 0; </stdlib.h></stdio.h>…

C言語でJavaScript風prototypeを作ってみた。

GCC

JavaScriptのプロトタイプってこんな感じかなぁと思って、C言語でJavaScript風プロトタイブを再現してみた。配列だけど。 #include <stdio.h> #include <stdlib.h> struct p2d { double x; double y; double (**prototype)(struct p2d *); }; typedef struct p2d Point2D; typed</stdlib.h></stdio.h>…

K&Rを読もう(6) 演習 1-13 単語の長さのヒストグラム表示

GCC

今回は激しくメンドクサイヨ。ヒストグラムも定番っすね。 演習 1-13 入力された単語の長さをヒストグラム表示せよ。これは応用でいける。 #include <stdio.h> #include <stdlib.h> #include <ctype.h> #define MAX_COUNT 10 void print_histgram(int n) { int i; for (i = 0; i < n; i++</ctype.h></stdlib.h></stdio.h>…

K&Rを読もう(5) 1.5(2) 関数チェーンを使ってwcを作ろう。

GCC

地震の影響で会社が休みになってしまった。さて、リストが出来たので早速料理再開。今回のテーマはwc。wcも定番っすね。線形リストを使って関数チェーンを作っていこうと思います。イメージはこんな感じです。 count_word > count_line > count_char > print…

glibメモ。

GCC

エンジンの仕組みを知らなくても車は運転できる。しかしエンジンの仕組みを知っていればより上手く車を運転することが出来る。車輪の再発明は避けるべきだが、車輪を知るための車輪作りは必要なのだ。しかし、車輪の再開発ばかりしていてもマズイ。車輪を使…

K&Rを読もう(6) 演習 1-8 - 1-12 空白をゴニョゴニョ

GCC

ソースが長くなってしまうので普通にやろう。 演習 1-8 空白とタブと改行を数える。なんとなくenumが使いたくなったので、enumを使用する。 #include <stdio.h> #include <stdlib.h> enum {WHITE , TAB, BREAK}; int main(void) { int c; int count[BREAK + 1] = {0, 0, 0}; whi</stdlib.h></stdio.h>…

K&Rを読もう(4) 番外 線形リスト作り。

GCC

リストが無いと死んでしまいそうなので、線形リスト作りました。汎用性を持たせるためにVALUE型にキャストして使うというRubyのネタをパクってみました。 list.h まずはヘッダ。 typedef unsigned long VALUE; struct list_struct { VALUE data; struct list…

K&Rを読もう(3) 1.5(1) catを作ろう。再帰と関数のネストのテストも兼ねて。

GCC

またまた定番。catを作ろうのコーナー。定番過ぎるので、再帰と関数のネストを使ってみました。バリバリgccオンリーのCコードデス。 #include <stdio.h> #include <stdlib.h> int main(void) { int (*f)(int) = putchar; void read_char(void) { int c; if ((c = getchar()) != </stdlib.h></stdio.h>…

関数の宣言のを自動化したい。

cで面倒なのが、関数を使う前に宣言されてないと使えないって所。関数名変えたり、引数変えたりすると面倒な作業が増えるので、自動化しちゃいたいなぁ・・・と思って、適当に作ってみた。 header ##!/usr/bin/perl my $tags = "tag"; (system("ctags -o $ta…

GCCで末尾再帰の最適化メモ。

GCC

忘れそうなのでメモメモ。gccで末尾再帰の最適化をしたい場合は、 % gcc -foptimize-sibling-calls最適化オプション-O2以上でも有効化出来る。 % gcc -O2安心して再帰が使えるようになりそうです。 参考 フリーソフトウェア徹底活用講座(21) GCC 4.1.0 の最…

K&Rを読もう(2) 1.2 - 1.3 温度変換

gcc

K&Rを見たとき、何処かで見た事のあるプログラムが多数存在する。温度変換もそのひとつ。正規表現のバイブル「ふくろう本」の例題でも使われている(読んでないけど)由緒正しき温度変換をボクノスなりに読み解こうと思う。 整数の割り算 温度変換のポイントは…

K&Rを読もう(1) Hello, World(2)

GCC

Hello, Worldを僕なりに書き直してみる。コンソールだけじゃつまらないので、ウィンドウに表示させようと思う。・・・といっても、ウィンドウを出すのは面倒なので、テキストでエミュレートする。 #include <stdio.h> #include <stdlib.h> enum {CONSOLE, WINDOW}; /* ウィンド</stdlib.h></stdio.h>…

K&Rを読もう(0) Hello, World

GCC

K&Rが発行されたのは1978年。それから30年近くの年月が流れた。未だにC言語のバイブルとして君臨しているのにはそれなりに訳があるはず。ちょっと斜め読んで見たところ、「よく見るプログラム」が多数ある。温度変換、単語の数え上げ、逆ポーランド電卓・・…

Hello,SIMD World!!

GCC

x86アセンブラ言語入門を買ったので、早速SIMDを体験したいと思います。いくぞ128ビットな世界へ〜。Pentium4以上、gasは最新版をお使い下さいませ。 hello.s .data .align 16 m128: .long 0x12,0x34,0x56,0x78 .text .global main main: movapd m128,%xmm7 …

グレイトなアセンブリ本を見つけた!

Amazonを徘徊していたら良さげな本があったので思わずクリックしてしまった。届いてみたらとんでもない良書だった!!x86アセンブラ入門―PC/ATなどで使われている80x86のアセンブラを習得 (TECHI―Processor)作者: 大貫広幸出版社/メーカー: CQ出版発売日: 2006…

セグメントレジスタのメモ。

Mona本読んでて気になった所。セグメント・・・。ちと理解が足らない所なのでセグメントレジスタについてまとめておこう。まず、セグメントレジスタの特徴。 16ビット時代の遺産。サイズは16ビット。 メモリを1Mバイトに拡張するための苦肉の策。 OS作る人以…

「新次元」のプログラミング言語、Befungeについて。

GCC

「新次元」のプログラミング言語Befungeが凄い。 Greenbear Laboratory - Befunge わかりやすい Befunge - Wikipedia なんとなく掴める Befunge 実装例 Befunge-93 言語仕様の邦訳 WikipediaのHello,Worldが美しい。 v @_ v >0"!dlroW"v v :# < >" ,olleH" v…

アセンブリ言語の教科書 第3章 数値のカウント(yieldで)

GCC

たのしいプログラミングをアセンブリで実現したくなったので、RubyのtimesをGASに移植してみた。 .text .global main main: push %ebp mov %esp,%ebp mov $10, %eax push %eax push $print call times mov $0, %eax leave ret times: push %ebp mov %esp,%eb…

アセンブリ言語の教科書 第3章 数値のカウント(再帰で)

GCC

Scheme勉強中なので、GASで再帰します。 .text .global main main: push %ebp mov %esp,%ebp mov $10, %eax push %eax call count pop %eax mov $0, %eax leave ret count: push %ebp mov %esp,%ebp mov 8(%ebp),%eax push %eax push $count_s call printf p…

アセンブリ言語の教科書 第3章 Hello, GAS world!!

GCC

サンプルに少し改良を加えました。 .text .global main main: push %ebp mov %esp,%ebp push $hello call printf mov $0, %eax leave ret .data hello: .string "Hello, GAS World!!" 一見何の変哲もないHello,Worldですが、かなり罠が隠れています。1行づつ…

アセンブリ言語の教科書 第3章 GDBの使い方。

GCC

アセンブリでprintfデバッグは辛すぎなのでのGDBデバッグについて学ぶ。アセンブリでも-gオプションが使える。 % gcc -g -o hello hello.s % gdb hello (gdb) l 1 .text 2 .global main 3 4 main: mov $1, %eax 5 mov $0xFFFF, %ax 6 mov $0b101010, %ah 7 m…

getlineラブ。

GCC

アルゴリズムの勉強用にC言語で1行読み込みを作ってみたけど、Rubyの方がずっと早かったorz。原因は、mallocの回数とioのバッファリングにあるような気がして今日はずっとRubyのio.cを眺めてた。ま、よくわからんのでwebを探索。・・・素敵なライブラリを発…

FreeBSDのlsを読む fts(3)でlsを作ってみよう〜。

GCC

FreeBSDのlsで使われているfts(3)がやたら便利そうなので、試してみた。環境はFedora6です。 ls.c #include <stdio.h> #include <stdlib.h> #include <fts.h> int main (int argc, char *argv[]) { FTS *ftsp; FTSENT *p; static char dot[] = "."; static char *dotav[] = {dot, NULL}</fts.h></stdlib.h></stdio.h>…

FreeBSDのlsを読む -tオプションを追え!!

GCC

ls -tで更新時刻順に並び替えることが出来る。 % ls -tと、昨日知ったので、ls -tでのソート処理を追ってみることにしました。 まずトップダウンで概要を探る。 mainから、vimの*(カーソル下の単語検索)でがが〜っとトップダウンしていく。まずは見るだけ。 …

ひらメソッドを読んでみた。

GCC

最近、人気の高いコードリーディング手法であるひらメソッドを読んでみました。ひらメソッドの重要ポイントは、 ボトムアップに関数を読んでいく 安心して忘れることができる環境 記憶しなければならない箇所を絞り込むことができる ってところですね。 今ま…

電卓作ってみた。

GCC

昨日、Rubyのソースコードを見ていたら、構文解析部分はyaccで作られていることがわかった。僕でも電卓くらいなら作れそうだ!!という気分になったので、Flex&Bisonで電卓を作ってみた。電卓といっても計算は正の整数のみ。演算子は+,-,*,/で、()の計算も出来…

ふつうのLinuxプログラミング 読了後の感想など

GCC

ふつうのLinuxプログラミング Linuxの仕組みから学べるgccプログラミングの王道作者: 青木峰郎出版社/メーカー: ソフトバンククリエイティブ発売日: 2005/07/27メディア: 単行本購入: 35人 クリック: 450回この商品を含むブログ (150件) を見る 入手した経緯…

ふつうのLinuxプログラミング 17章 ハッカーとの戦い。そして卒業。

GCC

ハッカー登場 ぐへへへへ。俺様はスーパーハッカーtanakaである。ぐへへへへ。今日はtelnetでお前の.vimrcを覗いてやる。お前の個人情報を丸裸にしてやるぅ。 % telnet localhost 4567 Trying 127.0.0.1... Connected to localhost.localdomain (127.0.0.1).…