べたーC

テンプレとはいえ、ここと同じデザインのblogを最近よく見かけて萎える。

さて、昨日とある事情によりCでプログラムを組んだ。
内容はワンダースワン用の開発キットのプログラムで、個々のボタンに効果音を割り当てて鳴らすもの。別に一から作るわけではなく、元となるプログラムがあって、それをいじくって機能を追加するというだけだ。
音を鳴らしたりする大筋の動作もライブラリが用意されていたので、あとはそれをいかに組み立てるかというだけだったが、まあ時間がかかった。C++から学んでいる人間がCに移ると意外と知らないことが多い(ぇ、俺だけ…?

まず読み込みや選択、再生などの操作をそれぞれ関数にする。
複数の関数で同じデータを用いることもあるから、そのデータはグローバル変数として宣言してあるんだが、それを用いる関数の中で同じ変数がextern宣言してある。
…えーっとexternってなんだっけヽ(´∀`)ノ

extern type val;
他のファイルで宣言されたグローバル変数valの型がtypeであることを宣言する

なるへそ。この変数は同じファイル内で宣言されてるから意味はないけど、プログラムが大きくなってきたときにファイルを分割するかもしれんから初めからexternしてあるわけか。

あとC++に慣れてるとこけるのがローカルの宣言。まず変数を最初にまとめて宣言して、それから処理していかないとダメ。C++みたいにテキトーなとこで変数追加とかできないのよね。だから、

for(int i=0;i<16;i++){}

とかやるとiの宣言が遅ぇー!とキレられる。
そのせいかforやめてwhileを使う癖がついてしまった。

んでC++からCに移ってテンパるのが文字列ね。
Cの文字列はchar型の配列で表す。この配列名が先頭アドレスを表すので、これを渡せば文字列全体を渡すことができる。…アドレスといえばポインタ。いやここではあまり関係ないんだけど、配列とポインタ、未だにマスターできてないなあ。
しかも今回は同じ類の文字列を複数使うので、文字列の配列で多次元配列を使ったりして大変。

char ddstring[n][m];

これはm文字(性格にはヌル文字が入るからm-1文字)の文字列がn個。
よって3番目の文字列を渡すには

ddstring[2]

を渡す。これで3番目の文字列の先頭アドレスが渡る。
これ配列の要素の形じゃん。一応接頭辞dを二つ付けて二次元配列だと明示してあるが、ポインタと配列をシームレスに扱えるちゅうてももうちっとわかりやすくしないと自滅するよなあ。実際ポインタに配列代入してインクリメントでアクセスしようとかして滅ったし。そのへん勉強してたら21世紀が終わりそうなので結局アナログな処理にしてお茶を濁してしまった…このしわ寄せがいつかくるのかなあ。

それからvoid*という楽しいものをはじめて知った(・∀・)
それからfarポインタやnearポインタも今更知った(;´д`)

いろいろありましたとさ。いや勉強になったよ。ありがとうs君。


…あと未だにbit演算できねえ恥ずかしい俺or2