2011-08-10 26 views
4

私はuint8_tを取る機能をしました*引数:はのconst char型にunsigned char型の*(uint8_t *)をキャスト*

uint8_t data[SPM_PAGESIZE]; // SPM_PAGESIZE = 256 bytes 
uint8_t sysex_data[SPM_PAGESIZE/2]; 
ihex_decode(data, strlen(data), sysex_data); 

しかし、これでは:私はこの機能を使用

uint8_t* ihex_decode(uint8_t *in, size_t len, uint8_t *out) 
{ 
    uint8_t i, hn, ln; 

    for (i = 0; i < len; i+=2) { 
     hn = in[i] > '9' ? (in[i]|32) - 'a' + 10 : in[i] - '0'; 
     ln = in[i+1] > '9' ? (in[i+1]|32) - 'a' + 10 : in[i+1] - '0'; 

     out[i/2] = (hn << 4) | ln; 
    } 

    return out; 
} 

場合、私のコンパイラ(AVR-GCC)が警告を返す:

のmain.cを| 89 |警告: 'strlenを' の引数1を渡し内のポインタのターゲットは符号の有無が異なる /usr/include/string.h|399|note:「* uint8_t」「のconstのchar *」期待が、引数は型である

だから、私は、データVARをキャストタイプ別の解決策を見つけました:

ihex_decode(data, strlen((const char *)data), sysex_data); 

この警告は消えますが、この解決策が安全かどうかは疑問です。

良い方法がありますか?非const * constの安全にキャストすることができますされ

おかげ

+1

明らかに 'char'型の' uint8_t'を使っているのはなぜですか? –

+0

私のプログラムはマイクロコントローラで動作しているためです。だから私は負の価値を持つことはできません。 –

+3

それは意味をなさない。入力データはASCIIの16進数のように見えるので、自然にcharです。もちろん、出力データはuint8_tのままです。 –

答えて

4

安全です。このエラーは、8ビットの符号なし整数を文字と混合することと関係しています。これは、ただcharを使用すると署名されます。

私は関数がuint8_tを受け入れ、charアクター演算を行い、それが(問題のために、またはconst char秒)char Sを受け入れる必要があること、しかし、参照してください。文字定数'c'はタイプcharであり、ihex_decodeの式で符号付きと符号なしを混在させているため、オーバーフローや負の数が大きな正の数として扱われないように注意する必要があります。

最後のスタイルノート。 inは変更されていないため、パラメータには上記のようにconst uint8_t* in(またはconst char* in)を読み込む必要があります。別のスタイルエラー(非常に悪いエラーにつながる可能性があります)はlensize_tとして受け入れますが、iループ変数はuint8_tと宣言しています。文字列の長さが255バイトを超える場合はどうなりますか?

+2

Charは、実装、AFAIKまでですが、署名または符号なしにすることができます。 –

+0

OK、@Rudy、 "この場合"を追加してください:) –

+1

あなたはそれを編集できます。 –

1

すべて* Cでそれを保存します。

+0

しかし、警告は 'const'修飾子を破棄することではありません。 – cnicutar

+2

警告は 'uint8_t *'から 'char *'への変換に関するものです – dreamlax

+0

私が答えた質問は、「この解決策が安全かどうか疑問に思っています。私はそれに答えた。 –

1

これは安全です。あなたが署名されていない署名から署名された署名にキャストしているので、警告(私が思う)がポップアップします。

+0

私はそれが**安全であることは完全にはわかりません。結果がなければ、警告の目的は何でしょうか? – dreamlax

+0

strlen()は** const ** char *を期待しているからではありませんか? –

+0

@Loïc:いいえ、そうではありません。 –

0

安全で、charの範囲は< uint8_tです。

関連する問題