数字、文字選択のローテート処理を実装。


RGKT-NDS-STDY-007(009)


まあ簡単な増分や下限処理で済ませてたから
実装自体は「あそこ弄って終わりだなー」って寝ぼけながら書き足しました。


ソースは以下(抜粋)。

static void incVal(INPUT_MODE input_mode)
{
	
	switch(input_mode){
		
	case DECIMAL_MODE:
		
		if(input_array[i] < '9')
			input_array[i]++;
		//ローテート用追記
		else if(input_array[i] >= '9')
			input_array[i] = '0';
		
		iprintf("\x1b[1D%c", input_array[i]);
		break;
///


10進の場合のもの。
case DECIMAL_MODE: 以下のインクリメント処理に else if で繋いで9以上なら0になるように変更しただけ。
デクリメント処理は逆に0以下なら9になるようにと。
16進や文字に関しても同様の処理を数行ずつ書き足しただけ。


実装が終わって今更だけど16進入力実装には若干悩みました。
内部的に数値で持ってれば16進表示は"%x"表示できて楽なんだけど
1桁1桁を配列で持たすと最終的に数値にする際の重みの計算処理が必要だなっていうのが引っかかって。
1桁文字として持てば16進変換自体は
stdlib.h インクルードして strtol 使って16進表記の文字列変換掛ければ整数に直すコードがスマートに書ける!
って着眼点は良かったんですが。^^;
文字として [0-9,A-F] をシークさせるのには少しだけ、大したことじゃないけど
工夫とやらが必要なのでした。
最終的な結果だけを得るならどちらの方法でも良いんだけどそんな適当なことしてちゃ
いつまで経ったって綺麗なコーディングが出来る人間になんてなれやしないんで妥協なしの方向で。
んでもって、悩んだ末に選んだのは
桁の重み計算実装より文字シーク処理実装の方が
後でコードを見返したとき、何やってるかぱっと見て分かり易いと思いそっちを実装することに。
16進数文字列→10進数整数変換は strtol 関数を使いました。
多分見易いと思う。思いますw
これが今の俺の精一杯の選択!


もし仮に重み変換がコンパクトに書けるコード浮かんだとしても多分悩んだかも知れませんが(汗)。
だってコメントの1行でも無いと、その処理が重み計算なのか何なのかって
コードぱっと見ただけで連想できるかって言われたら怪しいんだもん。


見やすいコードを書く努力、まだまだ終わりそうにないです(苦笑)。
早くもっと可読性の高いコードをちゃんと書けるようになりたいと夢みつつ…。