gcc

K&Rを読もう(32) 演習 2-9 - 2-10 bitcount

GCC

感動した。 演習 2-9 2の補数システムでは、x = x & (x - 1)により、xの最も右の1ビットが消える。何故かを説明せよ。この事実を使って、もっと早いbitcountプログラムを書け。 説明 01110000で説明する。x - 1をすると、 01110000 - 1 = 01101111一番右の1…

K&Rを読もう(31) 演習 2-6 - 2-8 ビット結合

GCC

この演習問題しんどかった。インラインアセンブラで死にそうに・・・。 演習 2-6 位置pから始まるnビットのyの右端のnビットにセットし,他のビットをそのままにしたxを返す関数setbits(x,p,n,y)を書け。 図にしてみる setbits(0x55, 4 , 3, 0xFF)を例にする…

K&Rを読もう(30) 2.9 2進数のダンプをマクロで

GCC

2.9はビット演算子の解説です。ビット演算といえば2進数のダンプが欲しくなる。型ごとに関数を作るのが面倒なので、マクロを活用してみた。 #include <stdio.h> #include <stdlib.h> #define dump(type, bin) \ do { \ int i; \ for (i = sizeof (type) * 8 - 1; i >= 0; i--) \</stdlib.h></stdio.h>…

K&Rを読もう(29) 問題2-4 tr -dみたいな。

GCC

夏休みだったので実家でゴロゴロしてました。休みぼけモードのtanakaです。 問題 2-4 問題の意図が掴みづらかった。「文字列s2中の任意の文字に等しい文字をs1から除去するような形のsqueeze(s1,s2)を書け」どうやら、 % tr -d abc % sed 's/[abc]//g'みたい…

C言語の配列を理解する。

GCC

C言語の配列宣言が、バイナリレベルでは全く違う事がわかってきた。次は配列とポインタの違いを探るために、array[i]と*(array + i)の違いを探ってみる。 #include <stdio.h> #include <stdlib.h> #define SIZE 5 int main(void) { int i; int array[SIZE] = {0, 1, 2, 3, 4}; f</stdlib.h></stdio.h>…

値の変更が出来る文字列についての格闘期。

GCC

ちょっとはまって調べてみたら、もっとはまってしまった・・・。値の変更が出来る文字列についての格闘記。 値の変更について func(char *s) { *s = 'a' } func("moge"); というアホなプログラムを書いてしまった・・・値が変更が出来る訳が無い!!なんとなく…

K&Rを読もう(28) 問題2-5 文字のマッチング

GCC

2-4より先に2-5をやる。文字列のマッチングをして、一致する文字の位置を返す問題。mixi時代にkusakabeさんに激しく突っ込まれたのでよく覚えてる。 #include <stdio.h> #include <stdlib.h> int any(char *s, char *match) { int i = 0; char *sp; char *mp; for (;*s != '\0';</stdlib.h></stdio.h>…

glibcのソースを入手してみた。

GCC

K&Rを読んでるとライブラリの再実装を行っているものが多い。しかし、K&Rでは初歩の初歩の実装を扱っているだけで全く足りないので、本物のソースを入手することにした。GNU C Library - GNU Project - Free Software Foundation (FSF)20MB。フロッピーディ…

C言語の文字列宣言を理解する

GCC

前回のエントリで、C言語の文字列宣言によって参照するポインタの位置に違いがある事がわかった。では、バイナリレベルでGCCがどのように解釈を行っているのかを理解したいと思う。 #include <stdio.h> void hello1(void) { char *s = "Hello, C String World !! Hell</stdio.h>…

K&Rを読もう(27) 問題2-3 htoi

GCC

16進文字列を数値に変換するhtoiを実装せよ。0xのある場合も考慮しなければならない。という問題。GCC拡張のcase 'a' ... 'f'を使ってみた。 #include <stdio.h> #include <stdlib.h> int htoi(char *s) { unsigned int i = 0; int tmp; if (*s == '0' && *(s + 1) == 'x') s +=</stdlib.h></stdio.h>…

K&Rを読もう(26) randの写経。

GCC

疑似乱数がこんなに単純なアルゴリズムで出来ているとは・・・。もっと単純にしてみた。 適当なa、p、qを選んで、ap + q = a'とする。次にa'をaに代入する。で、余りを取る。後はニュートン法のように繰り返すだけ。 #include <stdio.h> #include <stdlib.h> unsigned long int </stdlib.h></stdio.h>…

K&Rを読もう(25) atoiとlowerの写経。

GCC

K&Rを写経しよう。今回はatoiとlower。文字列演算が出てきたので、rot13(シーザー暗号)も追加してみた。 #include <stdio.h> #include <stdlib.h> int atoi_copy(char *s) { int i, n = 0; for (i = 0; isdigit(*(s + i)); i++) n = 10 * n + (*(s + i) - '0'); return n; } int</stdlib.h></stdio.h>…

K&Rを読もう(24) strlenの写経。

GCC

K&Rを写経しよう。サンプルは配列だったので、ポインタ演算でstrlenしてみた。 #include <stdio.h> #include <stdlib.h> int strlen_copy(char *s) { int i = 0; while (*(s + i) != '\0') i++; return i; } int main(void) { printf("%d\n", strlen_copy("test strings.")); /*</stdlib.h></stdio.h>…

K&Rを読もう(23) 演習2-2 getline改

GCC

今日から夏休みデス!!前回のGWはRuby三昧だったので、今回はK&R三昧にしようかと考えてますが、今回の夏休みは実家に帰る予定なので、あんまり進まなそう・・・。 演習 2-2 getlineを&&,||を使わずに・・・という問題ですが、前にやっちゃったので、略。ボク…

GNU catを読む - 全体的な流れ

GCC

GNU catのソース読んでます。長くなってきたので分割しました。 ソースコードのありか オンラインで見るときはCVSを sources Index of /coreutils/coreutils/src ソースはftpからゲットせよ。 Coreutils - GNU core utilities グローバル グローバル変数stat…

GNU catを読む - next_line_num()編

GCC

昨日、catのソースを読んでいて謎だったnext_line_num()の処理を解析してみた。 実際の動作を確認する。 cat -nで行番号表示が出来る。 % cat -n next_line_num.c 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 #define LINE_COUNTER_BUF_LEN 20 5 static char line_buf[LINE</stdlib.h></stdio.h>…

C言語にもboolがあった。

GCC

最近cflowの便利さに気づいたtanakaです。 % cflow cat.c | grep ':$' | sed 's/<.*//' main() usage() simple_cat() cat() write_pending() next_line_num()コールグラフが一目瞭然でっす。超便利。便利過ぎなので関数のみ抽出するシェルスクリプト作った。…

K&Rを読もう(22) 演習2-1 変数の範囲

GCC

演習2-1 変数の範囲を調べる問題。面倒なのでマクロで自動生成してみた。 #include <stdio.h> #include <stdlib.h> #include <limits.h> #include <float.h> #define UCHAR_MIN 0 #define USHRT_MIN 0 #define UINT_MIN 0 #define size(s, t, S) printf("%-15s : %2d byte %2d bit %16" #t "%16" #t</float.h></limits.h></stdlib.h></stdio.h>…

K&Rを読もう(21) 2-1 変数名

GCC

今日から2章に入ります。2章からは本格的に文法を扱っていくようです。文法ってとにかく面倒で大嫌いなんですが、C言語の文法をしっかり学んだ事が無いので飛ばさず学んでいきたいと思います。これからお世話になりそうだからな・・・。 変数名 「内部名では…

K&Rを読もう(20) 演習 1-24 括弧の釣合(4)

GCC

さて、最終段階に入ります。更なる抽象化を進めるためには高階関数を使うしかない!!1章の最後なので気合いを入れて挑みます。 #include <stdio.h> #include <stdlib.h> typedef struct { char *stack; int index; } Stack; void err_exit(const char s[]) { fprintf(stderr, s)</stdlib.h></stdio.h>…

K&Rを読もう(19) 演習 1-24 括弧の釣合(3)

GCC

やはり気になるので修正を加えた。引用符'\\'の処理でかなりハマった。 #include <stdio.h> #include <stdlib.h> void next(int *cp, int *np) { *cp = *np; *np = getchar(); } void quote(char q, int *cp, int *np) { while (*cp != EOF) { next(cp, np); if (*cp == '\\') {</stdlib.h></stdio.h>…

K&Rを読もう(18) 演習 1-24 括弧の釣合(2)

GCC

相当自信無し。 #include <stdio.h> #include <stdlib.h> #define MAX_BUFFER 1024 enum {OUT, COMMENT_IN, SQ_IN, DQ_IN}; void err_exit(void) { fprintf(stderr, "釣合が取れてません。\n"); exit(EXIT_FAILURE); } int main(void) { int c,d,next; int i = 0; int status = </stdlib.h></stdio.h>…

K&Rを読もう(17) 演習 1-24 括弧の釣合(1)

GCC

1章の最終問題です。激しくムズい!! 括弧の釣合が取れているかチェックする問題。これだけなら良いのだが「引用符・2重引用符・コメントがあった場合の処理も追加せよ」という難問。 とりあえず問題を切り分けよう。引用符チェック無しで解く。 #include <stdio.h> #i</stdio.h>…

K&Rを読もう(16) 演習 1-23 コメントの除去

GCC

/* */コメントの除去。 //==== コメント除去テスト /***************************************** * * ex-1-23.c * *****************************************/ //==== ここまで #include <stdio.h> #include <stdlib.h> enum {IN, OUT}; int main(void) { int c,d; int status </stdlib.h></stdio.h>…

K&Rを読もう(15) 演習 1-22 テキストの折り返し

GCC

K&Rの演習が段々むずかしくなってきたぞぉぉぉぉ。 指定文字数でテキストの折り返しを作る問題。長い単語にも対応しなければならないらしい。 #include <stdio.h> #include <stdlib.h> #define LINE 40 #define WORDMAX 1024 int main(void) { int c; int i = 0,j; int len = 0;</stdlib.h></stdio.h>…

K&Rを読もう(14) 演習 1-21 スマートタブ

GCC

GNUインデント 世の中には様々なインデント方式がある。その中でも最も奇妙なインデント方式がGNUであろうと思う。最初にGNU方式を目にしたときはハァ?ナンダコレ?などと思ったが、今はそのインデント方式が少し理解できるようになった。 スマートタブ さて…

K&Rを読もう(13) 演習 1-20 tabをスペースに変換。

GCC

演習 1-20 tabをスペースに変換する問題。タブをスペースに変換しても見えないので>----とVimっぽくしてみる。 #include <stdio.h> #include <stdlib.h> int main(void) { int c; while ((c = getchar()) != EOF) { if (c == '\t') printf(">-------"); else putchar(c); } exit</stdlib.h></stdio.h>…

K&Rを読もう(12) 演習 1-19 文字列の逆順表示

GCC

今回はcopy関数の応用です。結構めんどい。 演習 1-19 文字列sを逆に並べよ。 ま、コピーの逆をすればいいな。と甘く考えていたけど、よく考えたら、C言語の文字列は、 012345\n\0となるので、文字列の逆は、 543210\n\0となる。つまり、「改行をコピーして…

K&Rを読もう(11) 演習1-17 - 18 やはり古典は読むべし。

GCC

K&Rを読むべきか!?と思っていたがやはり読んで正解だった。古典には良質な問題が付いている。解答も付いていないので、正解を探る楽しさもある。生き残った古典には訳がある。やはり古典は読むべし。 演習 1-17 まずは肩慣らし、80文字以上の行を表示する。…

K&Rを読もう(10) 演習1-16 これでいいのか不明。

GCC

世界中を飛び回ってみたけど演習1-16は(世界中で?)評判が悪い。問題の意味が全くわからない。 「プログラミング言語C(第2版)」第一章演習の答え を参考に書いた。(ほぼコピペ) バッファがオーバーフローした時は読み飛ばして、1行を取得せよ? int main(voi…