C

宣言その2

C

kinaba さんの tweet から。 Cの型宣言、年に一回くらい流行る「英語で読む」という方法が、簡単なものをわざと難しく見せているように思えて好きになれないのです。(その方針の是非はさておき)使う時の構文と宣言の構文が似るようにという方針で設計され…

宣言

C

ref:http://sakurai.sumomo.ne.jp/page/c_pointer まぁ、普通は typedef 使え、ってな話だよね。signal の宣言なんか typedef 使わないとひどい。 /* with typedef */ typedef void (*sighandler_t)(int); signalder_t signal(int signo, sighandler_t handl…

assert

C

ref:http://d.hatena.ne.jp/kazuhooku/20090823/1251005064 こゆのは? assert("piecoev is initialized and fs is in range" && (fd < picoev.max_fd))

typedef クイズ 解答

C

ref:http://d.hatena.ne.jp/odz/20090111/1231689891 解説とかは面倒なので解答だけ。配列の typedef なんかは案外知らない人が多いのかな。まぁ、基本的に変数宣言と一緒だ。 typedef int* pint; typedef int aint[10]; typedef int (*pfunc)(void); typede…

typedef クイズ

C

C の型宣言って初心者には難しいよね、というネタ。 ポインタ編 以下の2つの文が同じ意味になるように typedef 文を書け。 int *p; pint p; 配列編 以下の2つの文が同じ意味になるように、typedef 文を書け。 int a[10]; aint a; 関数ポインタ編 以下のプロ…

setvbuf(3)

C

正直、setvbuf(3) は知らんかった。

div

C

ref:http://blog.bugyo.tk/lyrical/2008/11/cdiv.html 単に最適化の影響じゃね、とか思ったけど、コードをいじって実際にベンチマークをとったら確かに div の方が3倍くらい遅かった。

ポインタ

C

ref:http://d.hatena.ne.jp/Isoparametric/20080708/1215476026 もう散々書いた話だなぁ。「ポインタと配列が同じ」なんて風説はさっさと滅びるべき。 まぁ、このへんの誤解は 関数の仮引数における syntax suger (関数の仮引数部に限って type a[] は type …

無闇な cast は避けるべき

C

ref:http://d.hatena.ne.jp/PyTest/20080426/1209199486 下のと同じ記事だが。 void *list[] = {write_cat, write_dog}; void *function; function = list[valur]; ((void(*)(void))function)(); 無闇な cast というか、無闇に void ポインタを使わないほう…

enum

C

ref:http://d.hatena.ne.jp/PyTest/20080426/1209199486 どうせ enum を使うなら、ちゃんと enum を型として扱った方がいい。 つまり、 void local_error_handle(int error_type, char* string); ではなく、 void local_error_handle(enum local_error_types…

文字列リテラル

C

ref:http://www.kt.rim.or.jp/~kbk/zakkicho/08/zakkicho0804a.html#D20080405-3 おぉ。きむら(K)さんが調べてくださった。やっぱり undefined(未定義) だそうで。 さて、以下のプログラムを gcc 4.x でコンパイル/実行するとどういう出力が得られるだろうか…

関数ポインタ

C

ref:http://d.hatena.ne.jp/PyTest/20080405/1207384802 Google Code Search かなにかで getopt を調べてみるといいじゃないかと思った。てかわざわざ callback 用意するとか void ポインタをキャストするとかどうなのよっていう。 まぁ、typedef を使わずに…

配列とポインタ

C

そもそも、Cにおける配列とポインタは全然違うものなのだよなぁ。暗黙の変換や、文字列リテラルによる初期化構文、仮引数における syntax suger のせいで混同されがちだけど、だったらその辺を解説したほうがいいんじゃないだろうか。

初期化

C

ref:http://d.hatena.ne.jp/amachang/20080403/1207218609 盛り上がっているなぁ。 とりあえず、ひとつだけ付け加えるなら、 char s[] = "abcdef"; char* t = "abcdef"; とか書いた場合、「代入」ではなく、「初期化」なのだということを誰か書いてもいいん…

realloc

C

ref:http://d.hatena.ne.jp/PyTest/20080308/1204966485 途中で xrealloc2 から xmalloc2 に替わっていてそこで読み間違えているなぁ。 とりあえず、realloc について調べるといいと思うよ! あと、ソースコードを追っかけるなら、最低でも grep、できれば c…

sizeof を使ったコンパイル時チェック

C

ref:ときどきの雑記帖 i戦士篇 2008年1月(中旬) ふーむ。 #define wchar_t int /* do something */ #undef wchar_t /* do something */ とかそういうケースかなぁ。 単にコンパイル時にチェックしたいのなら、C++ の場合適当に boost の concept_check もど…

プリプロセッサマクロで sizeof を使う

C

ref:ときどきの雑記帖 i戦士篇 2008年1月(中旬) 多分、C/C++ の標準機能だけだと無理な気が。autoconf を使えば何とかなる。 まず、configure.ac に AC_CHECK_SIZEOF(int) AC_CHECK_SIZEOF(wchar_t) SIZEOF_INT=$ac_cv_sizeof_int SIZEOF_WCHAR_T=$ac_cv_siz…

下位2bit の XOR

C

下位 2 bit がそれぞれ違うことを調べる最速の方法は何か、という話。 これは,(x + 1) & 2 が一番速かった.なるほど.まぁ,速いと言っても,1, 2% とかそういうレベルなんだけど. ふうむ。うまいなぁ。

fast-math

C

ref:メカAG - 小飼弾はベンチマークのセンスがない まぁ、実は関数呼び出しが omit されているのは gcc 4.0.1 on Mac OS X 10.4 でしか確認できていなかったりして、そのあたりの原因が何処にあるのかは良く分からないけど、手元で再現できないなら疑われる…

今日のデバッグ

C

Cygwin で動くけど、Opteron サーバだと core dump するプログラムがあるというから見てみたら、なかがこんな感じ(簡略化してあって、本物はもう少し複雑なことをやる)。 char *p; int size; char *data; p = map_file(filename); size = p[0]; data = (char…

const attribute

C

やっぱり最適化で消えてしまうことがあるのか? 関数や手続きはその中で何やってるか分からんから,消さないと思ってい た (代入して,後ろの方でその変数を使うからなおさらそう思っていた). 標準で用意されているものは容赦なく消すこともあるのかも. …

APR とか CFL とか

C

ref:C言語でコレクションが使いたい!! - Ryoの開発日記 ref:はてなブックマーク - C言語でコレクションが使いたい!! - Ryoの開発日記 うーん、カーネル周りをいじるから C++ は使えないけど、APR は使える状況ってどんなだろ。apr を static link するな…

変数

C

あれ、変数の生存期間(not equal to スコープ)という話を説明しないといけないのも C の特殊事情だったりするかな?ローカル変数への参照を返してはいけないというアレ。

参照しないポインタ

C

そういえば、参照しないためのポインタというのも有り得たな。 int *search(int key, int *first, int *last) { int *p; for (p = first; p != last; p++) { if (*p == key) return p; } return last; } last は値そのものに意味があるわけで、決して参照す…

ポインタとポインタの指すアドレス

C

kmachu programming, pointer アイデンティティって、「ポインタ」というより「ポインタが指しているアドレス」ということかな? 「ポインタ」と「ポインタの指しているアドレス」の区別をする理由がよく分からない。 とりあえず、ポインタという変数の内容…

プロトタイプ宣言

C

ヘッダじゃなくて .c の方でプロトタイプ書く意味ってなんなんかな。 相互に呼び出し合う関数があったりすると、ないと困るような気が。あと、top down に関数を書いていく人はプロトタイプ宣言を書いておくと、関数の記述順序は気にしなくて良くなるから、…

ポインタの演算

C

C のポインタ演算を Haskell 風に書いてみる。 + :: Pointer a -> Integer -> Pointer a - :: Pointer a -> Integer -> Pointer a - :: Pointer a -> Pointer a -> Integer * :: Pointer a -> a & :: a -> Pointer a [] :: Pointer a -> Integer -> a こんな…

Object identity としてのポインタ

C

hyuki (2007-08-20 (月) 06:23) ポインタは「オブジェクト」を実装しようとしたところで重要性に気づきますね。アイデンティティとしてのポインタ。 オブジェクトを識別するのに参照用の値を使うことが便利なのは分かるけど、ポインタは本来参照するためのも…

配列とポインタ #3

C

なんか、ネタを小出しにしている感があるなぁ。まともな Web 環境にもどったしとりあえず、昨日のネタの簡単な解説をば。(C FAQ 1 見とけという話も) 型情報もまとめて出力すると、結果は下記のようになる。 a: value = 0xbffff62c, size = 200, type = int …

配列とポインタ #2

C

C の多次元配列は一応、「配列の配列」になっている。けど、dereference/reference の挙動が、多分、かなり直感に反することになると思う。「配列へのポインタ」でも同じく。要するにポインタの dereference ってのは単純な間接アドレス参照ではないのだ。 …