3

我不知道这是否可能,但帮助提出建议。

我有一个变量unsigned char Var_2_insert;,我有一个数组const unsigned char insert_here[4];

这个变量在运行时初始化 say var_2_insert = 225;。这个想法是数组中的索引 3 应该始终具有 var_2_insert 的值。所以我想尝试类似的东西

insert_here[4] = { 0x00, 0x02, 0x03, Var_2_insert};

这样每当我尝试读取数组insert here时,它都会有 var_2_insert 的当前值。现在我知道我是否会这样:

#define Var_2_insert 225

这会很顺利,但由于这个变量必须在运行时更新,我试过了

#define _VAR Var_2_insert
insert_here[4] = { 0x00, 0x02, 0x03, _VAR};

但不起作用。那么我该怎么做呢?我希望我的问题足够清楚。

谢谢。

4

6 回答 6

5

你可以做的是有Var_2_insert一个指向数组中第三个索引的指针:

unsigned char insert_here[4]; // since it's updating it shouldn't be const
unsigned char *Var_2_insert = &(insert_here[3]);
//you just need to update the use of var_2_insert to dereference..
//  var_2_insert = 225 // <-- before
   *var_2_insert = 225 // <-- after
于 2013-02-21T09:47:40.993 回答
3

如果数组元素在运行时发生变化,那么它们并不是真正的const。"#define" 与直接键入硬编码值相同,只是您让预处理器完成工作以及其他好处。但这无助于在此处根据需要动态更改值。

将数组声明为指针数组并引用它而不是像这样使用原始数组:

int var = 225;
int insert[4] = { 0x00, 0x02, 0x03, 255};
int *a[4] = { &insert[0], &insert[1], &insert[2], &var};

从现在开始使用这个指针数组,它将具有 的更新值var

于 2013-02-21T09:48:15.987 回答
2

数组初始值设定项在编译时定义数组内容,因此您需要在编译时知道要定义的值。但是其中一个值是在运行时定义的变量。

在这种情况下,您需要将数组初始化移至运行时:

unsigned char insert_here[4] = { 0x00, 0x02, 0x03};
insert_here[3] = Var_2_insert;

但在这种情况下,您是在声明后修改数组,因此您需要从数组定义中删除 const。

于 2013-02-21T09:35:30.823 回答
2

嗯...我不明白你为什么需要#define。如果您需要在运行时修改 var,请使用变量,而不是定义。第一种方法很好用:

char Var_2_insert = 225;
const unsigned char insert_here[4] = { 0x00, 0x02, 0x03, Var_2_insert};


“#define _VAR Var_2_insert” 这将在编译时将所有“_VAR”替换为“Var_2_insert”,因此您可以直接放入var。


编辑:好的,所以您随时都希望 insert_here[3] 具有 Var_2_insert 的值。它更复杂,并引入了一些可能产生硬错误的副作用,但如果你知道你在做什么,你可以用这样的指针来做:

const unsigned char insert_here[4] = { 0x00, 0x02, 0x03, 0};
unsigned char * Var_2_insert2 = (char*) &insert_here[3];

然后,如果您想将其用作变量,#define 是唯一(但不好)的解决方案:

#define _VAR (*Var_2_insert2)

你把你的 const 放在桌子上,但它只是告诉你的其余代码不可能修改它,而不是它是恒定的。

于 2013-02-21T09:41:55.473 回答
2

如果不是,为什么将其声明为常量?

unsigned char insert_here[4] = { 0x00, 0x02, 0x03, 0x00}; /* remove const */
insert_here[3] = Var_2_insert;
于 2013-02-21T09:44:01.307 回答
2

继@Roee Gavirel 的回答之后,如果您要使用 C++ 而不是 C,则可以通过使用引用变量来稍微清理一下语法:

unsigned char insert_here[4] ;
unsigned char& Var_2_insert = insert_here[3];

var_2_insert = 225 // modifies insert_here[3]

除了不需要解引用运算符之外,这里的区别在于引用可以被初始化但不被赋值,所以它总是引用 insert_here[3],而指针变量可以被重新赋值(除非你声明了它unsigned char* const Var_2_insert2,但你会仍然需要取消引用)。

与许多 C++ 功能一样,此实例与等效的 C 代码相比具有零开销。

于 2013-02-21T20:52:19.597 回答