藤原です。
This message is reply to Hirashita - san
(Subject was : [H8-ML(2151)] Re: 型変換に関して)
Message-ID: <NFBBIFEABDBPCMNHMEAKCEGFCGAA.iced@xxxxxxxxxxxxxxx>
in Mon, 12 Aug 2002 16:27:35 +0900 ...
> ひやしたです。
>
> > あと一つ見つけてしまったのですけど…… ii のインクリメントのタイ
> >ミングのせいで、結果に、'\0' がコピーされなとか。
>
> ん?どこの事でしょう?またしても大ボケしてますか?
>
これは、
> void ltostr(char* str, long nn)
> {
> char buf[16];
> int ii = 1;
>
> /* 逆さま文字列を作る */
> buf[0] = '\0';
> while(nn){
> buf[ii++] = '0'+ nn % 10;
> nn /= 10;
> }
>
> /* 逆さまにコピー */
> while(ii){
> *str++ = buf[--ii];
> }
> }
nn = 1 だったとすると、前半で、
buf[0] == '1' になりますよね。(ii++ 自体の値は 0 だから)
この段階で、ii == 1 です。でもって、buf[0] はすでに書きつぶされています。
後半のコピーに入った段階で、 ii == 1 なので、
while() のループは1回実行されます。
で、何がコピーされるかというと、buf[0] (つまり、'1')です。
あれ? '\0' は?
というお話です。
前半のコピーでは、
buf[ii++] としていれば、とりあえず、'\0' は書きつぶされずにすみますし、
後半のコピーでは、必ず1回は('\0' があるから)コピーするためには、
for (; ii >= 0;) *str++ = buf[--ii];
でしょうか。
> > かくいう私も、H8-ML(2137) で紹介したコードには、
> >「value がマイナスだったらこける」というバグがしっかり残っています。
>
> てゆーか、char buf[16]をヌル初期化してないとターミネートされないですよね?
あ、そうですね。
オリジナルがターミネートしない用途だったのを忘れていました。
でも、わざわざ初期化しなくても、
ptr[keta] = '\0' だけでOKですよね。
>
> > これは、エミュレーションだと問題なく動くのですが、(エミュレータ
> >の RAM はプログラムのロードと同時に初期化できるから)、ROMに焼くと、
> >(RAM の情報まで、ROM には持たせられないので)動かなくなるという
> >障害につながります。
>
> ですので、普通はスタートアップルーチンとかで、
> ROM上にアサインした初期化済み変数をRAMに転送したりしませんか?
普通はしますね。
でも、しなくても、エミュレータでは「動いてしまう」のが間違いの元と。
--
_/ -- Last 17576 hours until ATHENS 2004 Olympic Games (12 Aug @446) -
_/ FUJIHARA Keiichi
_/ E-Mail : keiichi@xxxxxxxxxxxxx <or> nagi@xxxxxxxxxxxxxxx
_/ URL : http://www.keiichi.fujihara.name/
--------------------------------------------+----- Luna Phase 4.11 --
PGP FingerPrint = 7CC3 4F95 8CC7 87D3 7178 C348 CD65 7F08 D68F 69F6