【发布时间】:2018-06-27 09:45:00
【问题描述】:
关于所用术语的说明:
对于静态数组,我的意思是静态分配的数组内存,例如:int x[10]。
问题
我需要声明一个带有易失元素的静态数组。 如果我很好理解 volatile 限定符的工作原理,它应该是:
volatile uint8_t *x; // x is a pointer to volatile uint8_t
uint8_t *volatile x; // x is a volatile pointer to uint8_t
volatile uint8_t *volatile x; // x is a volatile pointer to volatile uint8_t
好的,但现在我需要对 静态数组 做同样的事情。 我试过了:
volatile uint8_t x[10]; // Only the pointer is decleared as volatile
uint8_t volatile x[10]; // Same as above
volatile uint8_t *x3[10]; // Casting problems and errors when I do ...
*x3[0] = 1; // ... something like this. Moreover, I do not know if this...
// ... statement declares the uint8_t element as volatile
谢谢!
更新
好的,正如我应该使用的 cmets 中突出显示的那样:
volatile uint8_t x[10]
据我所知,问题不在于声明,而在于我的代码中此变量的使用。我将此元素传递给原型为:
static void functionName(uint8_t *buffer, uint32_t size);
我是这样调用函数的:
functionName(x, 10);
编译器报告:传递 'functionName' 的参数 1 会丢弃指针目标类型中的 'volatile' 限定符
无法更改函数原型,如何解决?
【问题讨论】:
-
首先,数组是不是指针。数组可以衰减为指向其第一个元素的指针,但它本身不是指针。其次,声明
volatile uint8_t x[10];将x声明为由 10 个volatile uint8_t元素组成的数组。 -
我建议您通过
typedef来“澄清”您的想法,您可以在其中定义数据类型 'volatile uint8_t *' -
如果您在传递函数参数时遇到问题,您可以更新您的问题以包含函数原型和错误消息。
-
如果不能更改原型,就不可能告诉
functionName对象是易失的。您可以复制要传递给functionName的数据并将其传递。例如,分配一些内存或声明一个本地数组,将数据从x复制到该内存中,然后将该内存传递给functionName。当然,那么functionName将不会看到在执行functionName期间发生的对x的任何更改。您基本上将拥有x的非易失性快照。如果functionName更改了数据,则在完成后将临时数据复制回x。 -
要么你需要一个 volatile 数组,要么你不需要。你不能有一个“有时不稳定”或“稍微不稳定”的数组。如果你需要一个 volatile 数组,将它传递给一个没有 volatile 限定的函数是一个错误,因为这样做没有任何意义。