【问题标题】:Pointer for ROM variable in a RAM variable?RAM变量中ROM变量的指针?
【发布时间】:2012-11-20 23:35:06
【问题描述】:

我正在使用 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] type qualifier mismatch in assignment”

我意识到 ROM 变量和 RAM 变量是两个不同的东西, 但我不知道该怎么做。

【问题讨论】:

  • 您好 Cal Pratt,欢迎您。我对你的文字做了一些小的修改,你可能想看看。

标签: c c18


【解决方案1】:

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 宏的定义,应该使用 romconst限定符):

// 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 的放置位置确实很重要。

【讨论】:

  • Microchip PIC 使用哈佛架构——ROM 和 RAM 位于完全独立的地址空间中,因此您不能将指向两者的指针混用。我相信他们使用自定义类型限定符将两者分开。
  • @duskwuff:好吧,我不知道。在这种情况下,只需将上述所有内容中的const 替换为rom,它仍然应该适用,假设编译器的行为合理。所以rom struct block *position = &map[0];应该是正确的定义。
  • @Adam Rosenfield:谢谢,解决了!我很确定我尝试过这样做但失败了:/我想我应该很快就睡觉了哈哈。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-03
  • 1970-01-01
  • 1970-01-01
  • 2010-11-11
  • 2021-11-11
  • 1970-01-01
相关资源
最近更新 更多