LuaSDL2: ビルドできない件

LuaSDL2とはLuaでSDL2を利用するためのライブラリであるが, gitからcloneしてビルドしようとするとうまく行かない.

問題

/home/hoge/tmp/luasdl2/src/window.c: In function ‘hitTestCallback’:
/home/hoge/tmp/luasdl2/src/window.c:915:2: warning: implicit declaration of function ‘lua_geti’ [-Wimplicit-function-declaration]
  lua_geti(cd->L, LUA_REGISTRYINDEX, cd->ref);
  ^
/home/hoge/tmp/luasdl2/src/window.c: In function ‘l_window_setHitTest’:
/home/hoge/tmp/luasdl2/src/window.c:950:10: error: void value not ignored as it ought to be
  if ((ut = lua_getuservalue(L, 1)) == LUA_TUSERDATA) {
          ^
/home/hoge/tmp/luasdl2/src/window.c:947:6: warning: variable ‘ut’ set but not used [-Wunused-but-set-variable]
  int ut;
      ^
CMakeFiles/SDL.dir/build.make:590: ターゲット 'CMakeFiles/SDL.dir/src/window.c.o' のレシピで失敗しました
make[2]: *** [CMakeFiles/SDL.dir/src/window.c.o] エラー 1
CMakeFiles/Makefile2:67: ターゲット 'CMakeFiles/SDL.dir/all' のレシピで失敗しました

warningは良いとして, errorについてみてみる.
lua_getuservalue関数はvoidらしい.
こんな単純なミスを犯すだろうか?
Lua5.2のリファレンスを見てみてもこの関数はvoidを返す.
ではLua5.3では?
intを返すのだ.

解決策

  • liblua-5.3-dev (Ubuntuの場合)をインストール
  • cmake .. -DWITH_LUAVER=53 でcmakeする

これで出来ました.
ちなみにgithubのissueに上がっています. 調べが甘かったです. apiリファレンスやヘッダファイルを調べるはめになりました.

cmakeのデフォルトがLua5.2らしいけど, デフォルトでビルドすると失敗するのは解決した今なら笑える冗談です. (バグだというのは重々承知の上で)

以上.

C# : NAudio と 高速フーリエ変換(FFT)

NAudioについての日本語の記事が少ないので備忘録も兼ねてNAudioでのFFTのやり方を書きます.

今回の目標はマイクから取得した音をフーリエ変換することです.

いかんせん自分が信号について素人なので、記事の対象読者は次の通りです。

  • 理屈に詳しくないが、フーリエ変換を活用したい。
  • NAudioの日本語での解説が見たい。

読者がゼロにならないことを願います。

続きを読む

プログラミング : リーダブルコードを読もう

単純に本の紹介です.

www.oreilly.co.jp

プログラミングをする者にとって一度は読んでおきたい本の一冊だと思います.
基本的なことしか書かれていない.しかし,それがいい.

プログラムをReadable(読めるように)書くにはどうしたらよいかをわかりやすく説明しています.
昨日の自分は他人.独りプログラマーでもぜひ読むべきだと思います.
上級者には面白みもないようですが...

言語がごっちゃの本なので,ちょっとほかの言語も読めないときついかもしれません(ただし,使われている文法はほぼ基本的なもの.C言語ができれば読破はたやすいでしょう)

以上 Raptor でした.

プログラミング : 関数を使う

タイトルを見て、
「あぁ、モジュール化が大事なのね。」
と思った方は、もう少し読んでみてください。
ここでいう関数とは、
「ある入力に対してただ一つだけの値を取る射」
という、数学の意味での関数です。
プログラミングにおいて強力なのは繰り返し構文ですね。
これさえあれば、どんな反復作業もシンプルにかけます。

しかし、ある作業に関しては、繰り返しよりも、数学的に導き出せる関数の方が、いい選択になるのだ、と、ここでは書きたいわけです。

例としては、総和が挙げられます。
1から10の和を求める時、明らかに繰り返しよりも、台形公式の方が計算量が減りより良いです。小数を扱う時は、特に誤差に気をつけなくてはならない繰り返しよりも精度が高いです。

ゲームなどで、キャラクターや弾の位置を決める時、もし、プレイヤーの行動が影響しないのであれば、関数で位置を決定する方が、リプレイの情報量が減ったり、記述がシンプルになったり、複雑なことができます。(時間を止めたり、巻き戻したりするのは、関数だと時間tをいじるだけでできます。)

また、関数はただ一度の計算で値を算出できるので、記述はシンプルになるし、場合によっては処理速度も向上します。

もし、時間に余裕があるならば、処理内容を表す関数を考えてみると、より良いプログラムができるかもしれません。

まとめ
精度が求められたり、シンプルに変わったことを実装したい時は、一度数学的な式で表せないかを考えてみると良い。また、普段のプログラムでも数学的な式で表す工夫をすると、良いものができることがある。

以上Raptorでした。

C言語 : ダブルポインタと二次元配列

ダブルポインタと二次元配列は別物であるという認識

次のコードを見てみる.

int foo[2][3];
int **ptr;
ptr = foo;

printf ("foo[1][2] = %d\n", ptr[1][2]);

これはポインタの型が違うのに代入してますよといって, 警告が出る. しかし無視して実行すると, 今度はセグメント違反が出る.

なぜか? これを考える.

続きを読む

C言語 : 配列とポインタ

配列へのポインタは面白い性質を持っている.

int foo[3] = {0};
int (*ptr)[3];

ptr = &foo;
printf ("ptr = %lu\n", (unsigned long)ptr);
printf ("foo = %lu\n", (unsigned long)foo);

これの実行結果は

ptr = 140737222446752
foo = 140737222446752
続きを読む

更新再開のお知らせ

使わないのもなんか勿体無いので、何かしら情報発信していこうかと思います。
主なテーマは以下の通り:
プログラミング
ゲーム開発
デジ絵

では、改めてよろしくお願いします。

Raptor