3

Microchip C18 コンパイラを使用してプロジェクトを行っています。他のブロック (北東南西) を指すブロックと呼ばれる構造体があります。これらのブロックは私を地図にしてくれます。次に、すべてを評価するために使用するポインターがあります。

RAMを使用すると、次のようになります。

struct block{
        struct block *north;
        struct block *east;
        struct block *south;
        struct block *west;
};


struct block map[5] =
{ // just a simple line.
        { NULL, &map[1], NULL, NULL },
        { NULL, &map[2], NULL, &map[0]},
        { NULL, &map[3], NULL, &map[2]},
        { NULL, &map[4], NULL, &map[3]},
        { NULL, NULL, NULL, &map[4]}
};


struct block* position = &map[0];

これにより、次のようなことができます。

void goWest()
{
if(position -> west != NULL) position = position -> west;
}

問題は、プロジェクトで RAM が不足していて、ROM を使用する必要があることです。これまでのところ、次のとおりです。

struct block{
        rom struct block *north;
        rom struct block *east;
        rom struct block *south;
        rom struct block *west;
};
rom struct block map[5] =
{ // just a simple line.
        { NULL, &map[1], NULL, NULL },
        { NULL, &map[2], NULL, &map[0]},
        { NULL, &map[3], NULL, &map[2]},
        { NULL, &map[4], NULL, &map[3]},
        { NULL, NULL, NULL, &map[4]}
};

私はいくつかのデバッグを行い、上記の部分が機能していることを確認できますが、位置ポインターを作成しようとすると、悲しみが生じます。私の質問は次のとおりです。

値を編​​集できるポインタに ROM 変数アドレスを保持するにはどうすればよいですか?

私が試すとき:

struct block *position = &map[0];

「警告 [2066] 代入で型修飾子が一致しません」というメッセージが表示されます

ROM 変数と RAM 変数は 2 つの異なるものだと認識していますが、どうすればよいかわかりません。

4

1 に答える 1

4

romマクロの定義は?コンパイラーは、または不一致を参照する「型修飾子の不一致」について不平を言っているため、const(おそらくコンパイラー固有またはそのような)に展開すると推測しています。__attribute__constvolatile

つまり、定数データへのポインターを非定数データへのポインターに暗黙的にキャストしようとしているということです。このコードは、コンパイラで同じ警告を生成する必要があります。

const int x = 0;
int *y = &x;  // &x is "pointer to const" but y is "pointer to non-const"

positionこれを修正するには、ポインターが定数データへのポインターであることを宣言する必要があります(romマクロの定義に応じて、romまたはconst修飾子を使用して宣言する必要があります)。

// Declare a non-constant pointer to constant data
const struct block *position = &map[0];

各ポインター レベルで、const修飾子を使用することも、それを使用しないこともできます。同様に、基本の非ポインター オブジェクトについても同様です。したがって、単一レベルのポインターには 4 つの異なるバリアントを含めることができます。

int *x;  // Non-constant pointer to non-constant data
int *const x;  // Constant pointer to non-constant data
const int *x;  // Non-constant pointer to constant data
int const *x;  // Same as above
const int *const x;  // Constant pointer to constant data
int const *const x;  // Same as above

int constconst intは同等ですが、それ以外の場合は の配置const 重要であることに注意してください。

于 2012-11-20T23:56:36.800 に答える