配列のサイズを大きくするなどしてメモリを消費すると、予期せぬ動作を起こします。
static unsigned char monsbuf[640];
逆に配列のサイズを抑えれば問題なく動作します。
static unsigned char monsbuf[320];
グローバル変数の配列に対して、宣言時に初期値を設定すると予期せぬ値がセットされるようです。(ローカル変数については問題ありません。)
static char newsR[] = {2,3,0,1,2};
int main(int argc, char *argv[])
{
:
}
これは次のようにして回避しています。
static char newsR[5];
int main(int argc, char *argv[])
{
newsR[0] = 2;
newsR[1] = 3;
newsR[2] = 0;
newsR[3] = 1;
newsR[4] = 2;
:
}
CHAR型の配列に正しくアクセスできない場合があるようです。(参考:
まつものページ)
char save_data[128];
char idx;
for (idx=0;idx<128;idx++) { save_data[idx] = 0; }
配列のポインタにて処理すれば問題ありません。
char save_data[128];
char idx;
for (idx=0;idx<128;idx++) { *(save_data + idx) = 0; }
同じようなケースとして、INT型のポインタをCHAR型にキャストして参照すると正しくアクセスできません。
int *p;
:
a = *((char *)p + 1);
これは以下のような関数を介して参照すると回避できます。
static char retchar(long ipos)
{
int wpos;
char shift;
wpos = ipos / 4;
shift = ipos % 4 * 8;
return *(p + wpos) >> shift;
}
:
a = retchar(1);
BGMや効果音を鳴らしたままFLASH ROMへの書き込みを行うと動作が停止します。
(TIMER2が原因?)
サウンドを止めてから書き込みを行えば回避できます。