2009-07-30 6 views
1

組み込みシステムの入力を解析しようとしています。C文字列をイン点に変換する問題

私はint型に別の文字列を変換しています
SET VARNAME=1,2,3,4,5,6,7,8,9,10\0 

は、両方atoi()strtol()は、文字列はここで8

私で始まる場合0を返すように見える: 私はこのような何かを期待していコード:

char *pch, *name, *vars; 
signed long value[256]; 
int i; 

#ifdef UARTDEBUG 
    char convert[100]; 
#endif 
if(strncmp(inBuffer, "SET",3)==0) 
{ 
    pch = strtok(inBuffer," "); 
    pch = strtok(NULL," "); 
    name = strtok(pch, "="); 
    vars = strtok(NULL,"="); 

    pch = strtok(vars,","); 

    i = 0; 
    while(pch != NULL) 
    { 
     value[i] = atoi(pch); 
     #ifdef UARTDEBUG 
      snprintf(convert, sizeof(convert), "Long:%d=String:\0", value[i]); 
      strncat(convert, pch, 10); 
      SendLine(convert); 
     #endif 
     i++; 
     pch = strtok(NULL,","); 

     // Check for overflow 
     if(i > sizeof(value)-1) 
     { 
      return; 
     } 
    }  

    SetVariable(name, value, i); 
} 

は、それを渡す:

SET VAR=1,2,3,4,5,6,7,8,9,10\0 

は私のUARTのデバッグに次のようなります:

Long:1=String:1                 
Long:2=String:2                 
Long:3=String:3                 
Long:4=String:4                 
Long:5=String:5                 
Long:6=String:6                 
Long:7=String:7                 
Long:0=String:8                 
Long:9=String:9                 
Long:10=String:10 

UPDATE:

私は前と後の両方inBufferをチェックしました '[i]を=税引後営業利益(PCH)値;'それは同一であり、正しい点に分割されているように見えます。

S E T  V A R  1  2  3  4  5  6  7  8  9 , 1 0 
53 45 54 00 56 41 52 00 31 00 32 00 33 00 34 00 35 00 36 00 37 00 38 00 39 2c 31 30 00 00 00 00 

UPDATE 2:

マイUARTDEBUGセクションには、現在読み取ります

 #ifdef UARTDEBUG 
      snprintf(convert, 20, "Long:%ld=String:%s", value[i], pch); 
      SendLine(convert); 
     #endif 

私はsnprintf()行をコメントアウトした場合、すべてが完璧に動作します。それでは何が起こっているのですか?

+0

値[]の宣言は何ですか? – bstpierre

+0

signed long値[256]; – Tim

+0

関数全体を表示したり、少なくともすべての接触した変数の宣言を表示すると、バグが見つかる可能性があります。 – ahy1

答えて

1

自分で書くことはできませんatoi? それは10行と同じように長いですし、あなたは簡単にそれをデバッグ(と問題が本当にここでチェック)することができます

  • '0' = 0x30
  • '1' = 0x31

など、あなたはちょうどあなたが

を持って各桁のため

string[x] - 0x30 * pow(10, n) 

ような何かをする必要があります

0

atoiは数値としてレンダリングできないものを返します。これはちょうど奇妙なことですが、文字列のバイナリ表現をダンプしようとしましたか?

+0

昼食後の私の次のステップ! – Tim

1

ない関連が、

if(i > sizeof(value)-1) 
       { 
         return; 
       } 

は、コードの他の部分は、オーバーフローが間違った方法でチェックし、そのため彼らは上書き行う場合

if(i == sizeof(value)/sizeof(value[0])) 
       { 
         return; 
       } 

が問題の原因である可能性がありますする必要がありますあなたの文字列の一部

+0

文字列はそのまま残っているようですが、atoiローカル変数が破損していると思います。 – Tim

1

自分のシステムでサンプルコードをコンパイルして実行しようとしました。出力が正しい(すなわち、出力文字列のどこに '8'が表示されているか)、私にあなたが提供したコードの範囲外で何かが起こっていることがわかります。

私は自分の変数や関数の1つが入力文字列やその他の変数や配列を踏みにじっていると言います。 SendLineとSetVariableは見る場所です。

さらに重要なことは、あなたの問題を解決するためのツールを教えていただけませんでした。人々にあなたのプログラムをデバッグするのを助けるように頼んだら、は、完全なソースを持つ簡単なテストケースを提供します。これは、問題の例です。それ以外の場合は、問題が何であるかを推測することができます。これは私たちのために不快で、あなたのために非生産的です。

+0

Iveは問題を解決し、snprintfローカル変数の一部がatoiローカル変数にオーバーフローしているようです。なんらかの理由で、snprintfはこの組み込みシステム上で全世界的な問題を引き起こします。 テストケースを投稿する際の主な問題は、同じコンパイラ、ライブラリ、およびエンベデッドプロセッサでテストする場合を除き、同じことをデバッグすることはないということです。私は例の文字列を掲示し、何を思いついたのか、まったく間違っているものがあるのか​​疑問に思った。 – Tim

関連する問題