-1

我正在将两个 ASCII 字符数组完美地写入 LCD 屏幕。但是我需要一个 if 条件来比较这两个值。

最初我试图像这样简单地比较它们:

if(currentTemp < triggTemp)
{
   alarmTriggered = true;
} 

由于这不起作用,我正在尝试使用 atof() 将它们从它们的 ASCII 字符串转换为浮点数。

然而,这似乎也不想工作,我在这里错过了什么愚蠢的东西吗?必要的代码如下:

void main () {

    char triggTemp;
    int buttonBool = 0;
    bool alarmTriggered = false;
    char currentTemp;
    double f_triggTemp = 0;
    double f_currentTemp = 0;


  TRISC = 0x00;
  init();
  Init_lcd();



  while(1) 
  {
      //char bufferString[4];
      currentTemp = get_temp();

      f_currentTemp = atof(currentTemp);
      f_triggTemp = atof(triggTemp);

      if(f_currentTemp < f_triggTemp)
      {
          alarmTriggered = true;
      }



      if(alarmTriggered == true)
      {
          soundBuzzer();
      }
}

这些值以这种形式从函数返回:

//some function
char bufferString[4];

sprintf(numberString, "%s.%s", itoa(bufferString,setTemp,10),
             itoa(bufferStringDec,setTempDec,10));

    return numberString;

本质上,我正在尝试比较这些 ASCII 字符的 char 数组,以便我可以使用 if 条件来触发警报。

我试图保持代码片段简短,我可以根据要求澄清。谢谢你的帮助。

编辑:我知道我正在使用atof变量double;我库中的原型就是这样设置的。

4

3 回答 3

0

创建一个函数来为您进行比较。这是一个完整的测试程序。您只需逐个比较数组元素。

int is_greater(char a[], char b[], int z, int z1) {
    int i = 0;
    for( i = 0; i < z; i++ ) {
        if( a[i] > b[i] ) return 1;
    }
    return 0;
}
于 2016-01-14T19:53:38.547 回答
0

我认为这就是你正在做的事情:

char* some_function() {
  char temporary_string_buffer[32]; // Or some other fixed size
  snprintf(temporary_string_buffer, 32, "some format");
  return temporary_string_buffer;
}

你不能那样做。好的,你可以这样做——你可能刚刚做了——但它具有未定义的行为,因为生命周期temporary_string_bufferreturn语句结束。在调用者中,函数将返回俗称的“悬空指针”;换句话说,一个指针,其目标不再具有任何意义。因此,当您开始调用atof该值时,它可能已被用于完全不同的事情。

如果你想返回一个字符串给调用者,要么:

  • 动态分配字符串malloc并确保调用者知道他们需要释放它;或者

  • 让调用者为您提供缓冲区的地址及其长度(作为参数),并填写提供的缓冲区。您可以使用返回码作为成功指示器,或者(如 sprintf)作为字节数,或其他。

于 2016-01-14T19:39:11.640 回答
0

char currentTemp; ... atof(currentTemp);不管用。 double atof(const char *nptr)需要一个指向字符串的指针,而不是char.

于 2016-01-14T19:39:12.680 回答