Cの最近のブログ記事

悪即斬

| コメント(0) | トラックバック(0)

saitou.c
結果もすごいが、そもそもコンパイルできる時点ですげーよww

スラッシュドット・ジャパン | ほぼすべてのBSDに存在してきたseekdir()のバグが25歳で死すという記事があったので、どんなbugでどんな修正をしたのか見てみた。個人的にLine48あたりがすげー気になった。(文法的な意味で)

例えば2つのint値を受け取り、足し算をし、その結果を返すような関数を定義するとしたら普通
int add(int a, int b) {/* 処理 */}と宣言するだろう。
ところが上記のソースを見ると
int add(a,b)
int a, b;
{/* 処理 */}
といった感じで宣言している。これはアリなのか?と思い確かめてみた。

#gcc -W test.c
#./a.out
6

コンパイル通ったし、しかも動いた...(´Д`)
こういう書き方初めて知ったー。なんか名前ついてるのかなぁ?

やっぱり、出来る人のソースを読むのは新しい発見が多いので為になる。

unixなosをbootさせたりすると-(ハイフン)がその場でクルクル回転したり,パッケージとかインストールするとプログレスバーが(====>みたいなヤツ)その場でにょきにょき伸びたりする.

あれってどうやるんだろう?って昔から思っていた.
なんか専用のgnu臭漂うライブラリーでも使うのかなぁと思っていたのだが,もっともっと簡単にできることを今日やっと知った.

(参考元:工学ナビ - C/C++ テクニック集)
キャリッジリターン(CR)を使えばイイだけなのだ.

Cだとwindowsのメモ帳でも改行されるように時々使う\rのみを使う.

#include <stdio.h>
 
int main(void) {
  while(1){
    printf(" -\r");
    usleep(100000);
    fflush(stdout);
    printf(" \\\r");
    usleep(100000);
    fflush(stdout);
    printf(" |\r");
    usleep(100000);
    fflush(stdout);
    printf(" /\r");
    usleep(100000);
    fflush(stdout);
  }
}

#gcc -o anime anime.c
#./anime
  -
するとそこには元気にくるくる回るハイフンの姿が!

#それだけです.本当にありがとうございました.

Javaのような考え方でテキトーにコーディングしてたらハマった...。
debugでコンパイルしたら動くのに、releaseだと何故かサーバと通信できない...。
構成をグリグリいじってみたら今度はdebugでも動かなくなり、頭の中が混乱した。
落ち着いてトレースしてみると、サーバに送るメッセージが送る段階でメチャクチャに壊れていた。

ちなみにサーバへ送信するメッセージを生成する部分は関数に分けている。
正直、テキトーに作った関数を載せるのが恥ずかしいが、やっぱり載せちゃう。

//サーバに送る登録メッセージを作成する。
char* make_regist_req(int island_server_port, int island_reply_port, int performance){
	char buf[128];
	sprintf_s(buf, sizeof(buf), "island_registration:%d,%d,%d\n", island_server_port, island_reply_port, performance);
	return buf;
}

研究用だしmallocじゃなく配列宣言でイイヤもう。とめんどくさがったのがまずかった。
改めて上のコードを見ると

kimoigirls_c.gif

な、感じなのだが、混乱してる最中は

  ( _, ,_)  < make_regist_req()の呼び出し元でbufが参照されてるじゃねぇかよぉぉー!
_(__つ/ ̄ ̄ ̄/_
  \/    ./

とマジで思ってた。どう考えてもヒープ脳でした。


今までの経験から考えてdebugで動いてreleaseで動かない場合はメモリー関連のエラーが多いねぇ。まぁ、debugの方も運良く動いてるだけの話なんだけれども。こーゆう煩わしさがないJavaはやっぱ楽だなぁとか思ってみたり。

#もうBoehm GC使っちゃいますか。

さっきからCいじったり、Perlいじったりしてて疲れたので休憩がてらに更新。とりあえず今日プログラミングしてて色々分かったことをメモ代わりに載せていく。


#開発環境編
-subversionであり得ないコミットをしてしまったとき(dir丸ごと削除とか)
Subversion メモ 以前のリビジョンに戻す (svn cat / svn merge)より

$ svn merge -r 303:302 http://svn.example.com/repos/calc/trunk
U  integer.c
$ svn commit -m "Undoing change committed in r303."

margeってこーゆう使い方も出来るのか。めもめも。

Tracと連携しているSubversionのリビジョンを戻す方法っていうのもあったけどリンク先でも指摘されているようにdbがぶっ壊れてるとか非常時でない限り多分marge使った方が安全。

#VC編
セキュリティ関係の警告(古い関数使ってんな関係)がいい加減煩わしく感じるようになったので_s系の関数で置き換えることにした。マニュアルをテキトーに見てた自分が悪いのだが、見事にこけた。調べてみたらすぐ見つかった

結局なんやねん! sscanf_sについてより
ただ,単純に"_s"を付ければいいわけではなく,キャラクタ等バッファサイズが不定のものは,受け付けるサイズを明示的に指定しないと強制終了してしまう.

%sフォーマットを指定したヤツは直後にサイズも教えてあげなきゃダメなのねぇ~。まぁ、脆弱性を克服してる関数だから当たり前と言っちゃ当たり前だが、呼び出し先がイチイチ指定してしなきゃいけないのがなんとも...Cの悲しい性かな。

それにしても指定しないと強制終了とか、ひどすぎる。実はsscanの前後に手を加えたマクロを置いておいたのでそっちが原因かと勘違いしてたorz


#Perl編
このクックブックが最高。色々なtipsが日本語で読める。「Data::Dumperを使って、DBIx::Classをデバッグする」とか「find_or_create が見付けたのか、列を作ったのかを知りたい?」とかタメになる情報が一杯。

DBIx::Classに大夫慣れてきた感じだけどこのO/R Mapper良すぎ。研究目的で現状10数テーブルを操作するアプリを作っているけど未だにSQLを一回も書かかずにここまできてます。

#おまけ

これはfuckと言われてもしょうがない。


すごい組み合わせ。ただ今超ヘビーローテーション中。

このアーカイブについて

このページには、過去に書かれたブログ記事のうちCカテゴリに属しているものが含まれています。

次のカテゴリはJavaです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

月別 アーカイブ

OpenID対応しています OpenIDについて
Powered by Movable Type 7.9.3