C でクロージャ

gcc 拡張を使うと、関数の中に関数を定義することができる。これを利用する と C でもクロージャが使えることを少し前に知ったが、 loading... ようやく理解できた…気がする。 クロージャとは C 言語のコールバック関数に近いが、引数以外の変数を自身が定義された静的 スコープで解決することが最大の特徴。 …だと理解しています。^^; コーディング例 #include <stdio.h> /* 任意の関数 func を n 回実行するだけのライブラリ関数 */ void dolist(void (*func)(void), int n) { int i; for(i = 0; i < n; i++) { func(); } return; } int main(void) { int level = 0; void lambda(void) { level++; } printf("%d\n", level); dolist(lambda, 1); printf("%d\n", level); dolist(lambda, 2); printf("%d\n", level); dolist(lambda, 3); printf("%d\n", level); return 0; } 結果 0...

2010-03-30 (Tue) · masutaka

UNIX 時間

業務で C 言語と、シェルコマンド date での UNIX 時間(1970 年 1 月 1 日 0:00 からの秒数)の取得方法を調べたのだけれど、我らが Emacs Lisp を調べていませんでした。 Emacs Lisp (time-to-seconds (current-time)) で良いようです。 真夜中ごろ - ポロポロ 業務で調べた UNIX 時間は以下。 シェルコマンド % date +%s => 1257925989 ※ Solaris9 の場合、SUN 謹製の date (/usr/bin/date) ではなく、 GNU の date (/usr/local/bin/date) を使う必要がある。 C言語 #include <stdio.h> #include <sys/time.h> /* gettimeofday() */ int main(void) { struct timeval tv; double unix_time; gettimeofday(&tv, NULL); unix_time = tv.tv_sec + (tv.tv_usec * 0....

2009-11-21 (Sat) · masutaka

セキュアコーディング

セキュアコーディング - JPCERT コーディネーションセンター ここに無料セミナーの案内が掲示されています。 「C/C++ セキュアコーディング ハーフデイキャンプのご案内 」 Part 1. 7月16日(木) 13:00-18:00 「文字列、整数」 Part 2. 8月 7日(金) 13:00-18:00 「ファイル入出力」 Part 3. 9月10日(木) 13:00-18:00 「動的メモリ管理、書式指定文字列」 昨年度の資料をダウンロードできます。 http://www.jpcert.or.jp/research/materials.html セキュアコーディングのドキュメントもダウンロードできます。 http://www.jpcert.or.jp/sc-rules/ まだ読んでないけど、無料とはすごい!!

2009-07-02 (Thu) · masutaka

main() の第 3 引数

処理系に依存してしまうが、main() の第 3 引数には環境変数リストが入っ ているとのこと。うちの Debian GNU/Linux squeeze では参照できた。 #include <stdio.h> int main(int argc, char **argv, char **envp){ int i; for (i = 0; envp[i] != NULL; i++){ printf("%s\n", envp[i]); } return 0; } (URL: 404 Blog Not Found:CGIの神話と現実 ) (URL: int void (main)の意味/// -OKWave )

2009-05-24 (Sun) · masutaka

gcc の -Wextra オプション

[2009-04-07-2] を調べていく過程で -Wextra オプションを知った。gcc3 までは -W とのこと。-Wall って、“all” じゃないのか。。。 -Wextra は、-Wall よりも厳しめの警告を出すようだ。両方有効にしたい 場合は、"-Wall -Wextra" と指定する。 詳しくは gcc の info に書いてあるみたい。確認してみるか。 URL: http://at-aka.blogspot.com/2006/11/gcc-wall-w.html URL: http://sugarpot.sakura.ne.jp/yuno/?gcc%2Fwarning

2009-04-07 (Tue) · masutaka

printf() のような関数を自作した。

せっかくの休みなのでw、printf() のような関数を自作してみた。 static char my_buffer[1024 * 1024]; extern void my_printf(const char *fmt,...); 訳あって、書き出し先は my_buffer という外部変数。 va_list も訳あって使えないので、可変長引数は自前で読み込む。 可変長引数はどう読み込めば良いか? C 言語の場合、内部変数はスタック に積まれるため、後に宣言したものの方が若いアドレスになる。でも、引 数の場合は違っていて、「引数1」の次のアドレスに「引数2」が存在する ことが保証されているらしい。 URL: http://networkprogramming.blog18.fc2.com/blog-entry-7.html これを利用すれば、可変長引数を自前で読み込むのは簡単。 fmt の中に %d や %x が見つかるたびに param32p を読み進めていけば良い。 void my_printf(const char *fmt,...) { unsigned long int *param32p = (unsigned long int *)&fmt + 1; ところが!!試しに最適化レベルを 3 にしたら、「引数1」の 前の ア ドレスに「引数2」が存在していた。ガセだったか…。以下のページにも 可変長引数を扱う時は stdarg.h 使えと書いてあった。va_list が使えな いというのは勘違いな気がしてきたので、後で確認してみよう。 URL: http://docs.hp.com/ja/B2355-90858/stdarg.5.html itoa() も使えないため自作した。「符号あり/なし 10 進数」と「符号な し 16 進数」をサポートしたが、意外に大変だった。一番時間かかったかも。...

2009-03-20 (Fri) · masutaka

同一ネットワーク上のマシン同士でのプロセス間通信

以下の Web site にサンプルソースとともに簡潔にまとめられていた。 素晴らしい。 URL: http://www.ueda.info.waseda.ac.jp/~toyama/network/example2.html 以下のマシンでテストした。 サーバ -> Cygwin on WindowsXP クライアント -> Debian GNU Linux squeeze (testing) make 時の注意 Debian では libsocket が見つからなくてリンクエラーになった。 Linux では不要らしいので、Makefile 中の -lsocket を削除した。 Cygwin では libsocket と libnsl が見つからなくてリンクエラーに なった。両方とも cygwin1.dll に含まれているらしいので、Makefile 中 の -lsocket と -lnsl を削除した。 テスト Cygwin で iserver.exe を実行し、クライアントからの通信待ち受け状 態にした。 Linux で iclient を実行した。そのまま文字列を打ち込んだら、大文字 に変換されて表示された。成功! 補足 大文字への変換は iserver.c の toupper() で行っている。iclient は 標準入力から受け取った文字列をサーバに送り、送り返された文字列を printf() しているだけ。

2009-03-14 (Sat) · masutaka

const の位置

(1) const int *p; (2) int *const p; (3) int const *p; (1) は const int なので、*p が read only になる。 (2) は *const なので、p が read only になる。 (3) は (1) と同じ。

2006-12-19 (Tue) · masutaka

データ型のサイズ

|char=1byte固定 | |(整数型) |short int <= int <= long int | |short int は short と記述可能 |long int は long と記述可能 | |(実数型) |float <= double <= long double URL: http://www9.plala.or.jp/sgwr-t/c/sec13.html

2006-05-25 (Thu) · masutaka

C言語で、小数の小数部分だけを抜き出す方法

その1 float shousuu, zenbu = 1.5; shousuu = zenbu - (int)zenbu; その2 #include <math.h> float zenbu = 1.5, seisuu, shousuu; shousuu = modff(zenbu, &seisuu);

2004-12-10 (Fri) · masutaka