C言語
以前、RCC2017アドカレ17日目を書いたので、その転載です。
ながらく放置していたGBA用の自作ゲームを作っていきます。 今回はひとまずHello Worldのビルドまでやっていきます。 前回は開発環境を整えたので、その続き。
今まで、C言語で構造体のメンバはメモリ上では配列のように連続していると思っていたんですが、どうも必ずしも連続とは限らないことを知ったのでその話。
今まで、Makefile書かないといけないようなある程度大きなプログラムを書くときに、ヘッダーの依存関係をMakefileに自分で打ち込んでいて、なかなか大変だったのでどうにか自動化できないのかなーって思って調べたら目から鱗だった話。
C++でコンテナクラスを一から書いたことがなかったので、ちょっと書いてみようと思ったんですけど、競プロで使いそうなデータ構造は目についたものは一通りライブラリ化してあったので、使うのかは分からないけど、リングバッファを書いてみました。
C言語での画像ファイルの取り扱いをやってみたかったので、指定した画像ファイルを自動でアスキーアートに変換して、標準出力に吐くプログラムを作ってみました。 github.com
printf("hello world")とfprintf(stdout,"hello world")が同じことをしてるのはよく知ってると思います。 じゃあfprintf(stderr,"hello world")との違いは?って聞くと、多分「標準出力と標準エラー出力だから出力先が違う」みたいなこと言われるんですけど…
エスケープシーケンスを使って、ターミナルでも色変えたり太字にしたり、なんやらかんやらができることを知ったので、2048を作ってみました。
C言語ではdouble型とfloat型の計算速度に違いがあることを知ったので、その話です。 float型の方が速い? double型は64bitでfloat型は32bitなのだから、普通は精度の低いfloat型の計算の方が速そうな気がしますが、実はdouble型の方が少し速いみたいです。 …
ビット数をカウントするアルゴリズムには色んな種類があるそうで、そのうち4つのアルゴリズムのC言語による実装とベンチマークです。
JavaとC言語では、実引数の評価順序に違いがある話。
int = int - long をすると、値がおかしくなるケースがあることを知ったのでその話。
実はC言語には「参照渡し」は存在しないって聞いたので、色々試してたら、どうも配列を関数に渡す場合は実は配列は渡されていなかったことに気付いて衝撃を受けたので、その話。
正体不明のバグが全然取れなくて、ずっと困ってたんですけど、実は処理自体は間違ってなくて、int型の最大値を表現するのに #define INF (0xffffffff) みたいなマクロを使ってたせいでした。
GBAソフトを個人で開発する世界を知って、C言語で全部書かれているので、Cしか満足に使えない(もしかしたらCも満足に使えてない)僕でもGBAソフト作れるんじゃね?ってことで、まずはMacのGBA開発環境から構築したのでそのまとめ。