首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C语言数组& for循环不能正常工作。

C语言数组& for循环不能正常工作。
EN

Stack Overflow用户
提问于 2019-08-05 11:13:42
回答 2查看 166关注 0票数 0

我用的是PIC18F26K83,我试图用NTCALUG02A103F测量温度。我计算了ADC输出和它们等于的温度。我已经创建了两个数组:一个用于ADC值,一个用于该ADC值的温度。在for循环中,我比较来自ADC的值和来自数组的值,如果我的ADC值小于数组值,它就会不断地减少数组元素,并最终得到258个ADC值,这是数组的最后一个元素。但是,在for循环中,它永远不会减少。即使我的ADC值是2000,它也不会继续。它被困在i=32了。以下是代码:

代码语言:javascript
复制
int i;
int temperature;
int temp_data;
int temp_ADC_array[34] = {259,  293,  332,  377,  428,  487,  555,  632,  720,
                          821,  934,  1062, 1203, 1360, 1531, 1715, 1910, 2113,
                          2320, 2528, 2731, 2926, 3108, 3274, 3422, 3552, 3663,
                          3756, 3833, 3895, 3945, 3983, 4013, 4036};
int temp_array[34] = {125, 120, 115, 110, 105, 100, 95,  90,  85,  80, 75, 70,
                      65,  60,  55,  50,  45,  40,  35,  30,  25,  20, 15, 10,
                      5,   0,   -5,  -10, -15, -20, -25, -30, -35, -40};
void main() {
  while (1) {
    temp_data = ADC_READ(3);
    for (i = 33; temp_data < temp_ADC_array[i]; i--) {
      temperature = temp_array[i];
    }
  }

编辑:这个for循环也不能工作:

代码语言:javascript
复制
for (i = 0; i < 34; i++) {
  if (temp_data > temp_ADC_array[33 - i]) {
    temperature = temp_array[33 - i];
    break;
  }
}

编辑2:我用一个led测试它,我的电路上没有USB,所以我不能使用调试器。下面是我测试温度的方法:(我检查led的闪烁)

代码语言:javascript
复制
for(i; temperature>=0; temperature=temperature-10){
  led=1;
  delay_ms(1000);
  led=0;
  delay_ms(1000);
}   
delay_ms(5000);
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-05 11:53:31

您在数组之外读取项-1等等,因为如果读取的值低于259,循环就永远不会停止。

例如,应该编写循环。

代码语言:javascript
复制
for(i=0; i<SIZE; i++) 
{ 
  if(temp_data < temp_ADC_array[SIZE-1-i]) 
  { 
    found = true; 
    break;
  }
}

但是您也可以忘记这一点,因为您有一个排序的查找表,因此应该使用二进制搜索。它可能会大大加快一切,特别是因为16位比较不是PIC的强项。

如果使用"O log(n)“,您将得到5-6个最坏的情况,而不是34个。即使二进制搜索意味着一些指针杂耍开销,它仍然应该超过-执行您的线性搜索。在如此缓慢的CPU上,这将是非常重要的,特别是因为与ADC相关的代码往往对性能至关重要。

票数 2
EN

Stack Overflow用户

发布于 2019-08-05 11:26:00

这个回答只是重复我的评论。它的目的是使人们能够接受它作为一个答案,使人们立即看到这个问题已经解决。

我认为,当条件不再为真时,您的第一个循环可能会在指定温度之前停止。这意味着温度太早就有了值。不过,在我看来,第二个循环很好。

第一个循环是

代码语言:javascript
复制
void main() {
  while (1) {
    temp_data = ADC_READ(3);
    for (i = 33; temp_data < temp_ADC_array[i]; i--) {
      temperature = temp_array[i];
    }
  }

它的问题是,当条件temp_data < temp_ADC_array[i]不再满足时,它就停止循环。因此,如果在i==0发生这种情况,温度仍然是temp_array[1]

第二个循环是

代码语言:javascript
复制
for (i = 0; i < 34; i++) {
  if (temp_data > temp_ADC_array[33 - i]) {
    temperature = temp_array[33 - i];
    break;
  }
}

它应该工作,因为它只有在指定正确的温度后才会中断。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57357428

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档