将已定义的变量插入到数组中

时间:2013-02-21 09:32:43

标签: c arrays embedded

我不知道这是否可行,但有助于提出建议。

我有一个变量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};

但是不起作用。那我怎么能这样呢?我希望我的问题很清楚。

感谢。

6 个答案:

答案 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)

嗯......我不明白你为什么需要#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保留在桌面上,但是它只是告诉你的其余代码它是不可能修改它的,而不是它是恒定的。

答案 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代码上的开销为零。