【发布时间】:2014-05-27 02:28:30
【问题描述】:
我遇到了一个显示一些奇怪行为的静态变量的问题。希望有人能帮忙,代码如下:
void digitRefresh(void){
static char digitenabled=1;
sprintf(digits, "%d", number+10000);
switch (digitenabled) {
case 1: digitDecode(digits[1] - 48);
CATHODE_1 = ENABLE;
break;
case 2: digitDecode(digits[2] - 48);
CATHODE_2 = ENABLE;
break;
case 3: digitDecode(digits[3] - 48);
CATHODE_3 = ENABLE;
break;
case 4: digitDecode(digits[4] - 48);
CATHODE_4 = ENABLE;
break;
}
delay_ms(DIGIT_DELAY);
disableAllCathodes();
return;
}
顺便说一下,数字被定义为char digits[5];
正如你所看到的,我定义了一个局部静态变量,所以当这个函数被多次调用时,我可以跳转到程序的不同位置。
我刮胡子的问题在于第二行代码。当 sprintf 被执行时,var digitenabled 以某种方式将其值更改为零。正如您在代码中看到的那样,它之前是一个,但是在冲刺之后我放置了一个断点,由于某种原因它是一个零。
如果我不通过注释掉它来使用 sprintf,那么问题就会消失,并且变量的行为符合预期(不会被清除并在再次调用函数时保留该值。
sprintf 做错了吗?所以变量消失了?有什么想法吗?
这是在使用 XC8 编译器的微控制器 PIC16F1847 上。谢谢
【问题讨论】:
-
数字是如何定义的?它需要是 char 数字[10],而不是 *digits。
-
数字是否有足够的内存空间来保存所有数字?
-
字符数字[5];作为全球。是的,程序中没有更多内容,我检查了数字数组,它包含了它应该包含的内容。
标签: c static printf pic reentrancy