今日のN開学習メモ。


RGKT-NDS-STDY-007(004)
RGKT-NDS-STDY-009(001)


昨日の input 関数を scanf ライクにするにはどうすればよいか調べてたら
学習本には載ってないようなテクニックとか、色々と発見があった。


・標準ライブラリ関数のソース
・可変長引数(動的引数)関数の作り方
・汎用ポインタ(void 型ポインタ)を用いたどんな型の引数でも受け入れる関数の作り方
・関数ポインタの使い方
C言語での static 宣言を用いたオブジェクト指向でいうカプセル化の実現方法


それと Nintendo DS でプログラミングさんところのライフゲームソース読んで
DS でのダブルバッファの実現の1手段を学習(知っただけw)。


10進版 input 関数が出来た時点で
数当てゲーム書いてちゃんと動作するとこまで行って
16進版と文字列版も作ろうかと最初は思ったんだが
BASIC の INPUT ステートメントや scanf() 関数は1つの受け皿で複数のデータ型、複数の変数に対応してるなーって思って
できるならこの input 関数もそんな風に出来たらなーって調べだしたら色々と巡り歩いてしまった次第なのです。


最終的には以下な感じにしたいとです。

bool inputf(const char * format, void *)


第一引数
書式指定して入力させるデータを選択
"%d" または "%D" 10進数入力
"%x" または "%X" 16進数入力
"%c" または "%C" 一文字入力
"%s" または "%S" 文字列入力

また書式内で入力フィールド幅を指定することで
入力桁数または入力文字数を指定することが可能としたい。


"%10d" または "%10D" 10桁までの10進数入力モード


ごく単純な書式解析とかならswitchとかifとかで書けば良いけど
printf() や scanf() と同じ書式を解析させるんなららわざわざ新しくコードを書かずとも
sscanf() 使って文字列から書式解析させた方がスマートかな。


第二引数
第一引数で指定したデータ型に対応した変数をポインタで参照渡し
数値型(10進数、16進数)なら int 型のアドレス、
文字列型なら char[] の先頭アドレス。


返値
ブール型。
入力が確定したら true 、入力が未確定(現在入力中とか)なら false としてます。
普通のコンソールプログラムの scanf() のように入力中、その関数内でフローが止まってよい環境なら
入力完了後に呼び出し元の関数に戻るだけでいいから、いつ入力確定したかが一目瞭然なので
上記のような返値はいらんのですが。
ゲームプログラムのように無限ループ内で他の処理もやりながらとなると
入力状態が今どうなってるのかという、フラグ的なものが必要だったのでやむなしに返値ありとしました。


ここまで色々含めるとなると
昨日のとりあえず書いてみたって段階で60行前後だった1関数が
数百行にまで膨れ上がりそうなんで
この1関数をさらに関数化して、ついでにそのインラインな関数は
inputf 専用関数として static 関数としようと思います。