0

ここでこの答えを見つけました: 構造体メンバーのサイズ

それを完全に私のコードにコピーしましたが、不完全なクラス型へのポインターを持っている私のコンパイラーオブジェクト。

uint8_t clStructCount = sizeof(((struct ALMConfStr *) 0)->IntelRecsPerPg);

私は何が間違っているのですか?clStructCountを実行時にIntelRecsPerPgの値と等しく設定したいと思います。これがその秘訣だと思いました。

ありがとう!

4

3 に答える 3

3

構造体の定義は、コンパイラが sizeof コードに遭遇した時点で可視である必要があります。

したがって、この翻訳単位は機能するはずです。

struct ALMConfStr {
  int IntelRecsPerPg[MagicNumber];
};
// ...
uint8_t clStructCount = sizeof(((struct ALMConfStr *) 0)->IntelRecsPerPg);

すべてが 1 つのファイルにあるか、構造体がコードの#include前のヘッダー d にあるか。sizeof

ただし、これは次のとおりです。

struct ALMConfStr;
// ...
uint8_t clStructCount = sizeof(((struct ALMConfStr *) 0)->IntelRecsPerPg);

コンパイラはaが何から構成されているか、またはそのコンテキストで an が何であるかを知らないため、機能しません。struct ALMConfStrIntelRecsPerPg

于 2013-01-29T18:27:06.260 に答える
0

の定義はないと思います。struct ALMConfStr

またはIntelRecsPerPgメンバーではないstruct ALMConfStr

言う

struct ALMConfStr{
//some member variables
data_type IntelRecsPerPg;
//some more member variables
};

基本的sizeof(((struct ALMConfStr *) 0)->IntelRecsPerPg)に取得しようとします

sizeof(IntelRecsPerPg)

構造体がアドレス 0 で使用可能であると仮定して、構造体で

于 2013-01-29T18:22:59.773 に答える
0

Useless' answer に関するコメントから:

私のヘッダーファイルから:

    typedef struct ALMConfStruct {
        uint8_t updateMode;
        uint8_t flashPgSize;
        uint8_t flashMaxPagesSize;
        uint8_t IntelRecsPerPg;
        fptr_t appResetAddr;
        uint16_t appEndAddr;
        uint8_t comIntf;
    }ALMConfStr; 

あなたのstructタグはであり、そうではALMConfStructありませんALMConfStr

struct ALMConfStr

struct新しい不完全型を宣言します。を削除するか、コードでstruct使用してサイズを決定します。struct ALMConfStruct

uint8_t clStructCount = sizeof(((ALMConfStr *) 0)->IntelRecsPerPg);

また

uint8_t clStructCount = sizeof(((struct ALMConfStruct *) 0)->IntelRecsPerPg);
于 2013-01-29T19:09:33.413 に答える