【发布时间】:2013-05-28 09:56:28
【问题描述】:
为了在程序执行期间保留变量(char 数组)的值,我有以下代码用于更大的代码。但是我看到 incrementCtr 没有效果,因为计数器被重置为零。你能指出在这里使用静态的正确方法吗?
static typedef struct {
uint8_t data[8];
}count_t;
......
static count_t count;
static void incrementCtr(count_t* count) {
int i;
for (i = sizeof(count->data) - 1; i >= 0; --i) {
if (++count->data[i] != 0) {
break;
}
}
}
void myroutine{
.....
....
count_t *counter;
counter = &count;
uint32_t len = sizeof(*counter);
memset(counter ,0,sizeof(*counter));
for (i = 0; i < len; i++){
printf("counter->data[%d] = %02X\n", i, counter->data[i]);
}
.......
do {
.......
incrementCtr(counter);
for (i = 0; i < len; i++){
printf("counter->data[%d] = %02X\n", i, counter->data[i]);
}
} while (true);
return 0;
}
第一个 printf 显示所有字节 0,在第二个 printf 中,字节值增加 1。但随后计数器重新初始化为 0 agian :(
【问题讨论】:
-
在同一代码中混合使用 "count_t count"、"count_t* count" 和 "++count->..." 不太可读。例如,我建议将您的指针重命名为“count_t* pCouint”。
-
你的意思是当你第二次调用
myroutine(这应该是一个函数,对吗?)它再次归零?那是因为memset你在那里,这正是它的作用...... -
@Daniel:我不认为缺少匈牙利符号(个人不喜欢它,但不管对你有用......)是这里最大的问题......说
sizeof(*counter)当你真正的意思是sizeof(counter->data)/sizeof(*counter->data)要严重得多。 -
感谢 cha0site。 memset是杀手。我以为我只是在循环,但没有看到 myroutine 被调用。我仍然不知道你为什么说 sizeof(*counter) 是错误的。考虑到我正在处理整个结构,我认为 memset 很好,sizeof 给了我结构的大小而不是指针大小
-
@cha0site 我不是在提议匈牙利语,只是不重复相同的变量名。对我来说,“static count_t a”和“static void incrementCtr(count_t* b)”也可以。我反对重复“计数”。