2017-02-06 14 views
-1

すでに存在する大きなコードにコードを追加する必要があります。 私のコードに* Ptrというポインタがあります。このポインタの型はunsigned charです。offsetofを使用せずに構造体メンバにオフセットを取得

unsigned char * Ptr;

私は以下の構造を持っています。

struct 
{ 
    uint8_t tag; 
    uint16_t data[size]; 
    bool status; 
}Test; 

Test *TagData; 

ポインタは以下のように型キャストされ、構造体ポインタはポインタPtrが指す位置を指しています。私のコードで

TagData = (Test *)Ptr; 

これらの値は、* ptrが指すメモリロケーションにコピーされるように、私は、この構造にいくつかの出力値をコピーします。

構造体のデータ配列にいくつかの値をコピーするには、その構造体メンバへのオフセットを見つける必要があります。私はoffsetof関数を使わずにやりたい私は以下をやってみましたが、コンパイラエラーが出ます。

TagData->data = (uint16_t *) (Ptr + sizeof(TagData->tag)); 

どのようにすればいいですか?そして、私はoffsetof関数を使いたくありません。これを行う簡単な方法はありますか?

+3

本当の質問は、なぜoffsetofを使いたいのですか?定義の典型的なオフセット( '(int)(&((type *)0) - > member)')を再利用することで簡単に行うことができます。しかし、これはおそらくあなたの問題を解決するものではありません。さて、POD以外のクラスのオフセットが必要で、コンパイラが不平を言っているからです。通常、コンパイラが提供するいくつかの組み込み関数があります。 gccの '__builtin_offsetof'です。 – dim

+1

Cは最小限の機能しか提供しません。したがって、標準的な方法があれば、 'offsetof'は標準に追加されませんでした。 – Olaf

+0

'offsetof'マクロを使用するより簡単な方法は、問題のメンバを直接使用し、そのようなメンバへのポインタを使用することです。 99%のケースでは、整数型とポインタとの間でゲームをやり取りしたり、前後に計算のオフセットを行う理由が全くありません。それをしないでください。それは間違っているだけで、コードを速くすることはできません。ポインタキャストは悪いです。 –

答えて

7

いいえ、必要な処理を行うように設計されたoffsetofを使用するより簡単な方法はありません。

また、offsetofは関数ではありませんが、offsetofを使用しなかった場合のポインタ演算を隠すマクロではありません。

したがって、明確な答え:あなたは理由を挙げていないので、あまりにも理由がありません。それを乗り越えてoffsetofを使用してください。

関連する問題