2011-10-30 14 views
0

私はどこに問題があるのか​​正確にはわかりませんが、参照によって 'メモリ'を渡すと動作しません。イムここ2メモリからのビックエンディアンの読み込みとメモリの増分

によってビッグエンディアンと増分データでのメモリから単語を読み取ろうとすると、私は

WORD ReadBigEndianWORD(char **Data) 
{ 
    WORD Result = (unsigned char) *Data[0]; 
    Result <<= 8; 
    Result |= (unsigned char) *Data[1]; 
    *Data++ 
    return Result; 
} 

それを行う方法であると私はdoesnの上で、この

char *Memory = ........; 
WORD MyWord = ReadBigEndianWORD(&Memory); 

コードのようにそれを呼び出します'Function Argmentが' char * Data 'でデータが' Memory 'として渡されていれば動作します。

これは、メモリからBig Endianを読み取る最も良い方法ですか?

ありがとうございました。

+0

なぜここにダブルポインタが必要ですか? –

答えて

2

あなたのコードが原因*オペレータの操作の優先順位と[]動作障害が発生している:

また、次のように使用することができます。 []は、優先順位が高いので、あなたは、あなたにコードを変更する必要があります。*Data[0]

WORD ReadBigEndianWORD(char **Data) 
{ 
    WORD Result = (unsigned char) (*Data)[0]; 
    Result <<= 8; 
    Result |= (unsigned char) (*Data)[1]; 
    (*Data) += sizeof(WORD); 
    return Result; 
} 

ラインあなたがゼロのオフセットを追加しているため、正常に動作してしまいます。 2番目の*Data[1]は、初期化されていないメモリを読み込んでいるため、悪いデータを与えるか、クラッシュします。 *Data[1]\*(\*(Data + sizeof(char**)))に相当するので、メモリが格納されている場所をタックして、それを過ぎて移動します。

何が起こっているかを確認する最善の方法は、あなたの元ReadBigEndianWORDを使用してに呼び出し元のコードを変更することです:あなたはそれを見ることができますことを行う場合

char *Memory[2] = { "........", ",,,,,,,,," }; 
short Myshort = ReadBigEndianshort(Memory); 

*データ[1] [メモリを指しています1]。

次にデータポインタを次の作業に移動するには、のサイズでインクリメントする必要があります。char**のサイズは++ではありません。

しかし、誰もがあなたのメソッドを変更してchar*を受け取り、呼び出し元のコードでバッファ内を移動することを心配していると言われています。それはあなたの機能をよりきれいにするでしょう。

0

てみてくださいそうのように、Dataの周りに括弧を追加:

WORD Result = (unsigned char) (*Data)[0]; 
(*Data)++; 

しかし、ポインタツーポインタのようなものがあなたを混乱させる場合は持っている一つの機能が読んように、あなたはより良い、より簡単な方法でコードを書きますデータ、および別のポインタが増加します。実際には、無関係のものを別々に行うほうがよいでしょう。普通はコード内で**を避けるのがよいでしょう。

WORD ReadBigEndianWORD(unsigned char *Data) 
{ 
    return (Data[0] << 8) | Data[1]; 
} 
関連する問題