我不知道这是否可行,但有助于提出建议。
我有一个变量unsigned char Var_2_insert;
,我有一个数组const unsigned char insert_here[4];
。
此变量在运行时初始化为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};
但是不起作用。那我怎么能这样呢?我希望我的问题很清楚。
感谢。
答案 0 :(得分:5)
你可以做的是Var_2_insert
指向数组中第3个索引的指针:
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
答案 1 :(得分:3)
如果数组元素在运行时更改,那么它们实际上不是 const 。 “#define”直接键入硬编码值是相同的,除了让预处理器在其他好处之外完成工作。但这无助于动态更改您想要的值。
将数组声明为指针数组并引用它而不是像这样使用原始数组:
int var = 225;
int insert[4] = { 0x00, 0x02, 0x03, 255};
int *a[4] = { &insert[0], &insert[1], &insert[2], &var};
从现在开始使用此指针数组,其指针的更新值为var
。
答案 2 :(得分:2)
数组初始值设定项在编译时定义数组内容,因此您需要知道在编译时要定义的值。但其中一个值是变量,它在运行时定义。
在这种情况下,您需要将数组初始化移动到运行时:
unsigned char insert_here[4] = { 0x00, 0x02, 0x03};
insert_here[3] = Var_2_insert;
但是在这种情况下,你在声明后修改数组,所以你需要从数组定义中删除const。
答案 3 :(得分:2)
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保留在桌面上,但是它只是告诉你的其余代码它是不可能修改它的,而不是它是恒定的。
答案 4 :(得分:2)
unsigned char insert_here[4] = { 0x00, 0x02, 0x03, 0x00}; /* remove const */
insert_here[3] = Var_2_insert;
答案 5 :(得分: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],而指针变量可以重新赋值(除非你声明它{{ 1}},但你仍然需要取消引用。)
与许多C ++功能一样,此实例在等效C代码上的开销为零。