体重と今日食べたもの

k1segawa.exblog.jp

ダイエット

ブログトップ

ポケコン PC-G850Vで電子回路工作(6/5)

少し間違っているのと、ちょっとだけCっぽく構造化したのを書いてみる。

まず、間違いはpsetの文の次のxの144を越さないようにした行。グラフィック座標は(0,0)-(143,47)なので、144と比較して偽なら0になるので0*x=0にしているのだが、その行は本来if文が{}で括られていなければ条件成立時に実行されるようにならない。まあでもこれでもxをインクリメントしてなくても実行しても問題ないので、影響なかったという事。22は≒1024/47である。

あと、このC特有の機能(マニュアルに書いてあった)だが、自動変数の配列の初期化を最初にやっているが、本来staticかグローバルでないと初期値は入れられない。スタックが毎回初期化されるってこと。

それとoutput関数は0x20までとマニュアルには書いてあるがopenしないで使ってるから0x60とか使えているのかな?

で構造化してみたのがこちら。

main() {
unsigned char a[35]={8,0,2,6,2,6,0,4,2,6,0,5,0,5,0,5,0,
5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,8,12,99};
int c,d,i;
unsigned char r;
int x=0;

clrscr();
outport(0x60,1);
outport(0x61,1);

do {

c=10;d=0;i=-1;

do {
outport(0x62,(a[i] & 0xFE);
if((a[i] & 1)!=0) {
r=inport(0x62);
if(c!=10) {
if(r==1)
d+=(1<<c);
if(c==0) {
pset(x++,d/22,1);
x=(x<144)*x;
}
}
c--;
}
} while(a[i++]!=99);
} while(1);
}
普通はdo {} while() じゃなく while() {}を使うのだが、末尾の{}の対応が、画面の狭いポケコンでは付けづらいのであえてdo-whileにした。BASICならWENDなのでこんなことしないでもIF文のブロックと区別がつく。
また99との比較を末尾に置いたのでデータは必ず99以外で始まることが前提となる。

この方がgoto文やラベルが無くなって、ループの範囲と意図が伝わりやすい。
さらにコメントも入れてみたが、よけいわかりづらくなった。関数は短くシンプルに。コメントが不要なくらいに。

変数cもデクリメントを条件文の中に入れてもいいが、やりすぎてわかりづらいのでやめた。

BASICも構造化した方が分かり易いかな?

やっぱり構造化言語にとってポケコンの縦も横(タブ2がせいぜい)もスクリーンが小さすぎるな~
[PR]
by k1segawa | 2015-06-06 00:22 | ポケコン | Comments(0)