オーバーフローする理由解決した!!
27日のレビューで以下のようなプログラムのkの宣言をcharからunsigned charに変えたら直り、その後shortにしたと書いたが、なぜそうなったかの理由付けが解決できた。
mapはshortでdami4はlongでkはcharで宣言されていました。
dami4は256個用意された配列でmapは16×16個用意された二次元配列である。
k=0;
for(y=0;y<16;y++){
for(x=0;x<16;y++){
map[x][y]=*(dami4+k);
k++;
}
}
確かに上のプログラム文書だとkは255まで足される。charは8bit用意されるので、そのままだと確かにcharで十分である。しかし、8bitは8bitでも用意されるのは+と-の領域があるため+4bitと-4bit分である。そうなると・・・+128-128づつ確保されk++で128回目に1が足された週間に-になりわけの分からん値が出力される結果となるわけである。
うまくいかない場合は必ず何らかの要因があるはずである。それを見逃しておくと後々酷い目にあうし自分自身の為にならないので今回のようなプログラムは正しく動作して問題なかったが原因を調べるということはよいことであると思います。
ただ、もっと早く何で気づかなかったのであろう?俺バカだな~
0 Comments:
Post a Comment
<< Home