ひしだまの変更履歴

ひしだまHPの更新履歴。
主にTRPGリプレイの元ネタ集、プログラミング技術メモと自作ソフト、好きなゲームや音楽です。

CreateProcess関連

2013-01-10 19:49:10 | PG(C言語)

Windows API(C言語)のCreateProcessCreatePipe・DuplicateHandleConsoleCtrlHandlerについてメモ。
この辺りについては昔から色んな人が色々書いているので、今回はエラー処理も略さず書くようにしてみた。 

プロセスの生成・別プログラムの実行はUNIX(POSIX)のforkexecには似ていないが、パイプとかハンドルの複製とかはUNIX(POSIX)のpipe・dup2に似ている。
でもハンドルの継承まわりは理解できるまで超意味不明だった(爆)

しかしC言語は面倒くさいわー。
今回の例はgccで書いたからまだマシだけど、エラー時もハンドルをちゃんとクローズしようと思ったら、try~finallyが欲しくなる^^;
素直にsetjmp/longjmpを使う方が楽かもしれない(苦笑)

たまにC言語をやってみると、Javaがいかに便利か(C言語の不便な点を改良しようとしたか)よく分かる。
Javaが不便だとか言ってる人は、C言語は絶対出来ないなー。
そんで、そういう人がScalaを覚えたらJavaには戻れないだろうなw

コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PCUnit

2013-01-08 22:04:42 | PG(C言語)

C言語のテスティングフレームワークとしてはCutterがすごく便利なんだけれども、MicrosoftのしょぼいCコンパイラー(cl.exe)では使えなかったorz

改めて探したところ、PCUnitが良さそうだったので試してみた。
「ポータブル」の名に恥じない軽さで、MircrosoftのしょぼいCコンパイラーでも使うことが出来た。
アサートマクロの種類はCutterより少ないが、充分。
Cutterはtest関数を自動収集してくれるが、PCUnitでは自前で書く必要があるのは仕方ない。(Rubyで書かれた収集用スクリプトが提供されているけど)

それにしてもMicrosoftのCコンパイラー(Windows SDK7.1)は今どきC99にも対応していないとは。C99ってもう10年以上前だよ?
変数を関数の途中で宣言できないし、配列のサイズにローカル変数(つまり定数以外)を指定することが出来ないし、コードを書いててイライラする。
まぁ、今どきMicrosoftのCコンパイラーを使おうなんて人間はほとんどいないだろうから、Microsoftが力を入れないのは分かるけどさぁ。(で、力を入れた結果があの不便そうなWindows8か)

コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Windows用Cutter

2013-01-07 23:59:10 | PG(C言語)

C言語用の単体テストフレームワークであるCutterをWindows(Cygwin)にインストールしてみた
当初はCygwinのライブラリーを追加インストールするのをケチってたのでconfigureやmakeでエラーが出まくった(苦笑)が、なんとか使うことが出来る状態になった。

次のステップとしてMinGW用のコンパイルに挑戦してみたのだが、こちらは挫折orz
コンパイラーが異なるとglibが使えなくなるというのが分からない。バージョンによってはコンパイルエラーになるような文法でも使ってるってことなんだろうか…。 

コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

exitの単体テスト

2012-11-23 11:12:41 | PG(C言語)

引数が間違っているから異常終了するぜ!というコーディングは、Javaだと例外を投げればいいが、C言語だとexit()を呼ぶことが多いと思う。
で、「exit()することを確認するテスト」をCutterで実施する方法を考えてみた。

C言語はマクロを使えるので、exit()をlongjmp()に置き換えてしまえ、という荒業(笑)
C言語のマクロはほんと強力だわ^^;

ただ、setjmp/longjmpは、使い方を誤ると訳の分からない状態になる。
Cutterだとテストの関数をたくさん作ることになるので、それぞれでちゃんとsetjmp()しないと、あるテストでexit(longjmp)したら“別のテスト時にsetjmpした場所”へ跳んでしまった、なんて事が起こりうる。もしそうなったらチンプンカンプンな結果になるので、テストのデバッグをしないといけなくなる。大変ですぜーorz

コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Cutter用makefile

2012-11-18 16:02:47 | PG(C言語)

Javaでの開発はJUnitでテストするのが当たり前になっているので、C言語でもそれっぽいもので単体テストしたい。
(自分でテストフレームワークっぽいものを作ろうと思えば作れるけど、さすがに面倒だし)
CUnitというものが世の中にはあるようだけど、同じCUnitという名前でも何人かが作っていて異なっているらしい^^;
そんな中、CUnitよりもCutterの方が良いという意見をちらほら目にしたので、Cutterを試してみた。

そしたら、なるほど、これは便利!
assert関数はJUnit3に似ていて分かり易いし、種類が豊富に揃っている。
テスト実行関数も自動的に収集してくれるので、main()に自分でテスト関数呼び出しを書いたりする必要も無い。
テスト結果も見やすい。(テスト失敗時には値とソースの場所まで出てくれる!)
ドキュメントも日本語でかなりの分量が書かれている。

惜しむらくは、ドキュメントのチュートリアルが複雑すぎることか^^;
「テストは自動で繰り返し行えるようにするものだ」という意思はひしひしと伝わってくるのだが、その為にacファイルとかamファイルとか(聞いたことないよ)を用意しなければならないように見えて、敷居が高そうに感じられてしまうorz
これに関しては『凡人プログラマーの独り言 Cutterのとても簡単な使い方』が非常に分かり易かった。最小限のCutterは拍子抜けするほど簡単だったw


で、それを参考に自分でもmakefileを作ってみた。(さすがに毎回gccコマンドを手で叩くのが良いとは思えないし)

makefileを書くのは久しぶりだったんだけど、ちょっと調べてみたら今さらながら知らない機能があるのにびっくりした^^;
テキスト変形関数って、超便利!
指定ディレクトリー内の*.cファイルの一覧を変数に入れるとか、UNIXコマンドを実行した結果を変数に入れるとかが出来る。
昔はこのやり方を知らなくて、makefile内にファイル一覧とかをいちいち書いてたんだよなぁ。ちくしょーw

コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする