C RAM变量中ROM变量的指针?

C RAM变量中ROM变量的指针?,c,c18,C,C18,我正在用微芯片C18编译器做一个项目。我有一个称为块的结构,它指向其他块(东北-西南)。这些积木会让我成为一张地图。 然后我有一个指针,我用它来计算一切 仅使用RAM看起来像: struct block{ struct block *north; struct block *east; struct block *south; struct block *west; }; struct block map[5] = { // j

我正在用微芯片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;
}
问题是,我的项目中内存不足,需要使用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变量是两个不同的东西,
但是我不知道该怎么办。

宏的定义是什么?我猜它会扩展到
const
(可能是编译器特定的
\uuuu属性\uuuu
或类似的东西),因为编译器正在抱怨“类型限定符不匹配”,这是指
const
volatile
不匹配

这意味着您正试图将指向常量数据的指针隐式转换为指向非常量数据的指针。此代码应在编译器中生成相同的警告:

const int x = 0;
int *y = &x;  // &x is "pointer to const" but y is "pointer to non-const"
要修复它,您需要声明
位置
指针是指向常量数据的指针(根据
rom
宏的定义,应该使用
rom
const
限定符来完成):

在每个指针级别,您可以有一个
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-const
const-int
是等效的,但除此之外,
const
的位置也很重要。

Hi-Cal-Pratt,欢迎光临。我已经对你的文本做了一些小的编辑,你可能想看一看。微芯片PIC使用哈佛体系结构——ROM和RAM在完全不同的地址空间中,所以你不能混合指向这两个的指针。我相信他们正在使用一个自定义类型限定符来分隔这两个。@Dashwuff:啊,好吧,我没有意识到这一点。在这种情况下,只要将上述所有内容中的
const
替换为
rom
,并且假设编译器的行为合理,它仍然适用。所以
rom结构块*position=&map[0]应该是正确的定义。@亚当·罗森菲尔德:谢谢,这就解决了问题!!我很确定我试过了,但失败了:/我想我应该很快睡觉了,哈哈。
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