[H8-ML(2152)] Re: 型変換に関して
From: FUJIHARA Keiichi <keiichi@xxxxxxxxxxxxx>
Date: 2002年08月12日(月)18時56分55秒
藤原です。

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


スレッド概略
[2147(R)](起点)
 └[2151(U)]
   └[表示中]
     ├[2153(1)]
     └[2154(2)]


投稿順に移動
[←前の記事へ(P)]
[→次の記事へ(N)]


リスト表示へ
[このスレッド(T)]
[本記事の前後(L)]