RGKT-NDS-STDY-007(005)
今日はソースをブリーフケースに入れ忘れてしまったので
実装メモだけ書いといて、帰宅したら作業したいと思います。
関数定義ファイル
inputf.h
inputf.c
プロトタイプ宣言
bool inputf(const char *, void *);
インライン関数
static incVal(void); //上ボタンが押されたときの動作。数値を増やす static decVal(void); //下ボタンが押されたときの動作。数値を減らす static revVal(void); //左ボタンが押されたときの動作。前の桁に戻る static nextVal(void); //右ボタンが押されたときの動作。次の桁に進む static fixVal(void); //Aボタンが押されたときの動作。入力を確定する
変数もこの関数変数のみのstaticとすることで
この関数ファイル内でグローバル変数として扱えるようにする。
また、値は関数の仕様上保持させておく必要があるので
そういう意味もあっての static である。
bool inputf(const char *format, void *value) { /// }
処理の流れ
毎フレームのつど実行させるため
中の処理すべきブロックはフラグによって
実行させていく。
フラグ0:
初回実行時動作。1ループ目。
1、値初期化
2、sscanf()による書式解析
書式解析に失敗した場合、フラグは0のままとし
何度実行したところで入力処理に進めないようにする。
書式解析に成功したら
フラグ1とし、入力待ち用プロンプトの表示して
2ループ目以降は入力受付状態のブロックへ移行する。
入力桁数指定について。
指定なし、または指定桁が1以下の場合1桁入力。
指定桁数が2以上ならあわせて桁数も変化させる。
であるが元々確保してある配列数以上は確保できないようにしとくか、
はたまた動的にchar型でメモリ確保するか。
フラグ1:
入力受付状態動作。及び入力確定待ち。2ループ目〜ラスト。
書式指定にあった指定に合わせて入力可能とする内容を変化させる。
10進数 [0-9] 'd' || 'D'
16進数 [0-9,A-F] 'x' || 'X'
一文字 [ASCII CODE 32-127] 'c' || 'C'
文字列 [ASCII CODE 32-127] 's' || 'S'
引数のvoid型ポインタのやりとりについて。
10進数、16進数の場合、
関数内配列で数値を文字列で持っておき
値確定となった際、
10進数ならatoi()、16進数ならstrtol()で数値型に変換すれば良いが
文字列型の場合、
受け取った配列のポインタをそのまま
関数内で処理する配列と対にして、
文字変更処理をリンクさせなければならないということ。
つまり
数値入力処理の場合での変数は入力確定後に決まるが
文字列入力処理の場合での変数は入力を受けるたび変化するということになる(現状では)。