我正在使用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变量是两个不同的东西, 但我不知道该怎么做。
答案 0 :(得分:4)
rom
宏的定义是什么?我猜它扩展到const
(可能还有编译器特定的__attribute__
或者其他),因为编译器抱怨“类型限定符不匹配”,它指的是{{1} }或const
不匹配。
这意味着您试图隐式地将指向常量数据的指针转换为指向非常量数据的指针。此代码应与您的编译器生成相同的警告:
volatile
要修复它,您需要声明您的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];
限定符或缺少限定符,同样适用于基本非指针对象。因此,单级指针可以有4种不同的变体:
const
请注意,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
的展示位置很重要。