作業日誌

目次

メニュー

コメント

コメントはありません。 Comments/mkawasaki

お名前:

過去の日記

11月2日

C : enum型で大量に宣言した連番をifで分岐に使うときの話

もし

enum tag1 {NOSTUFF=0,A,B,C,D,E,F,G,H,I,J};
enum tag2 {NOCODE=0,CODE_C,CODE_D,CODE_E,...,CODE_C10}; // (30個とか40個とかあるとしゅごい)

のように大量にenumで宣言してあり、

if(nanika==areka){
	if(koreha==A)sound=CODE_C;
	else if(koreha==B)sound=CODE_D;
	else if(koreha==C)sound=CODE_E;
	...
	else sound=NOCODE;
}
if(nanika==soreka){
	if(koreha==A)sound=CODE_C4;
	else if(koreha==B)sound=CODE_D4;
	else ...
	else sound=NOCODE;
}
if(nanika==nannda){
...
}
return sound;

のようにenumで宣言(=連番)したものを条件と照合し、別のenumで宣言したものを出力(ここではsound)する場合、上記の書き方よりも

define KOREHA_NUM (ここに条件に必要なアルファベットの数)
int i=0; 			// BYTE でもいい
if(nanika==areka)sound=CODE_C;	// index 
else if(nanika==soreka)sound=CODE_C4;
else ...
for(i=NOSTUFF;i<KOREHA_NUM;++i){ 	// i=0
	if(koreha==i+1)sound+=i;	// i+1=Aなのでこれと一致する場合sound+=0;
}

とした方が良い(気がする)。
見にくくなるかもしれないが、後で書きなおすときにインデックスとenum内の順番だけ書きかえればいいし、条件のnanikaが多いとその分倍々にコードが(無駄に)増えていく。せっかくenumで連番で宣言しているならfor文でインクリメントして走査した方が良いと思う

もちろんだがenumで宣言する際に意味のある順番で並ばせる必要がある。
順不同で宣言なんかしたら連番の意味がないです( ^^)
ていうかenumで宣言したらこういうこと思いついてもいいはずなのに諸々終わった後に気付いた俺はバカだ( ^^)

( ^^)

( ;;)ブワッ

まぁけどenumで大量に宣言とかあんまり使わないよなぁ…
enum便利だから皆使うといいさ!

と思ったけどWikipediaによると列挙型に数値演算はあんまりやらない方が良いみたい

http://ja.wikipedia.org/wiki/%E5%88%97%E6%8C%99%E5%9E%8B

Cは列挙型に数値を自由に設定出来る上に演算も許されてるから上記の走査が出来るだけで、Javaとかではそのまま整数との演算は許されてない…だと……?
自分の感覚としては大量の状態を連番で#defineするような感じです
要は可読性…ッ!可読性の向上…ッ!マジックナンバーの…圧倒的…ッ圧倒的な見にくさ……ッ!!(言い訳)

11.08.24(wed)

UARTのBaud Rateについて

UARTで値を見るときに何かときどきおかしい値が出るor値がズレているというのはBaud Rateが合っていない可能性があります

Acknowrichなどでは任意でBaud Rateを変えられますが用意されているものを使った方が良いらしいです。(9600bpsとか14400bpsとか)

分周は N=Sysclk/(8*BaudRate) で計算して四捨五入した値使えば多分大丈夫

11.07.25(mon)

PSoCのI2CHWモジュールについて

タッチセンサを使うときにslave側に秋田先生のサンプルを入れる人へ

Designer5.1でプロジェクトを読み込むとI2CHWのバージョンが違うので更新しますか、というメッセージが現れます。
 これを更新してslaveにダウンロードするとおそらく動きません。原因はMaster側のプログラムでReadStatusが変わらずCompleteになっていないことと思われます。(けどデータは送れてる)

 解決法としては

"I2CHWをバージョンアップせずにslaveにダウンロード"

"バージョンアップした状態でslave側を変えずmasterのプログラムでReadStatusのフラグを読む行を書かない(コメントアウト)"

の2択?

 バージョンアップした状態で自分でslave側のプログラム新しく書けば出来そうな気もする(試してない)。Designerが5.0から5.1に変わったのに伴ってサンプルコードとかが修正されてたり変わってたりするので古いプロジェクトとか使うときは注意。


トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2022-10-02 (日) 11:12:58