仅使用嵌套的if语句打印更改的值

时间:2016-05-31 16:44:15

标签: c++ architecture

我有四个不同的传感器,并将它们记录的值存储在结构中。现在我想每分钟打印这些值。但只有与上次打印相比发生变化的值!

struct SensorData{
  uint8_t temp; //temperature
  uint8_t pres; //presure
  uint8_t hum; //humidity
  uint8_t fuel; //fuel
};

我用15个ifs解决了这个问题。但这有点难以阅读和调试。所以,如果有更好,更优雅的方法来解决这个问题,我会更加努力。

所有可能性的表:如果值与之前的值不同则为1,如果它们相同则为0:

enter image description here

这就是我现在用ifs解决它的方法:

if(storeData.temp != sensorData.temp && storeData.pres != sensorData.pres && storeData.hum != sensorData.hum && storeData.fuel == sensorData.fuel){
    //print case 1: temp,pres,hum
  }
  else{
    if(storeData.temp != sensorData.temp && storeData.pres != sensorData.pres && storeData.hum == sensorData.hum && storeData.fuel != sensorData.fuel){
      //print case 2: temp,pres,fuel
    }
    else{
      if(storeData.temp != sensorData.temp && storeData.pres != sensorData.pres && storeData.hum == sensorData.hum && storeData.fuel == sensorData.fuel){
        //print case 3: temp,pres,
      }else{
        if(storeData.temp != sensorData.temp && storeData.pres == sensorData.pres && storeData.hum != sensorData.hum && storeData.fuel != sensorData.fuel){
          //print case 4: temp,hum,fuel
        }else{
         ...

就像我提到的那样,我正在寻找一种方法来解决这个问题,而不使用15 ifs。谢谢你的帮助

4 个答案:

答案 0 :(得分:3)

您的表只是表示传感器的四位的枚举。因此,您可以进行四次比较并相应地调整结果的位:

#include <cstdint>

struct SensorData
{
    enum Index
    {
        Temperature = 3,
        Presure = 2,
        Humidity = 1,
        Fuel = 0
    };

    std::uint8_t temp; // temperature
    std::uint8_t pres; // presure
    std::uint8_t hum;  // humidity
    std::uint8_t fuel; // fuel
};

unsigned compare_sensors(const SensorData& a, const SensorData& b) {
    unsigned result = 0;
    result |= (a.temp != b.temp) << SensorData::Temperature;
    result |= (a.pres != b.pres) << SensorData::Presure;
    result |= (a.hum  != b.hum)  << SensorData::Humidity;
    result |= (a.fuel != b.fuel) << SensorData::Fuel;
    result = 15 - result; // adjust order
    return result;
}


#include <iostream>

int main()
{
    SensorData a = {};
    SensorData b = {};
    b.pres = 255;
    b.fuel = 255;
    std::cout << "Prssure/Fuel change is case " << compare_sensors(a, b) << ".\n";
}

答案 1 :(得分:2)

我会使用4 if s:

std::string output;
char delimiter = ',';

//Check if data changed
if (storeData.temp != sensorData.temp)
    output += std::to_string(sensorData.temp) + delimiter;
if (storeData.pres != sensorData.pres)
    output += std::to_string(sensorData.pres) + delimiter;
if (storeData.hum != sensorData.hum)
    output += std::to_string(sensorData.hum) + delimiter;
if (storeData.fuel != sensorData.fuel)
    output += std::to_string(sensorData.fuel) + delimiter;

//Check if nothing changed
if (output == "")
    ;//Skip using 'return'?

//Remove 'delimiter' from last case
output.erase(output.length() - 1, 1);

//Send 'output'
//....

答案 2 :(得分:0)

您可以使用4个if语句 分别检查每个变量的变化,在每个print块中使用if语句。

根据提到的限制,我找不到任何你不应该这样做的理由。

如果您想在一个打印声明中打印它们:
使用上面提到的4个if语句,并使用4个变量来保存每个if语句中的值。最后,将它打印在一行中。

另一种方法是建立&#39;打印字符串&#39;或者&#39;数字&#39;一步一步(从空string开始,并在每个if语句中构建它。)

答案 3 :(得分:0)

您可以使用数组来存储值,并使用循环来检查哪些数组元素已更改。 C中的粗略轮廓(可能包含错误,未通过编译器运行):

#include <stdbool.h>
char *sensorNames[] = {"temp", "pres", "hum", "fuel"};
uint8_t sensorData[4];
uint8_t storeData[4];
int i;
bool first

while (1) {
  get_data(sensorData);
  first = true;
  for (i=0; i < sizeof(sensorData); i++) {
    if (sensorData[i] != storeData[i]) {
      // something changed
      if (!first) puts(", "); // add a comma if not first item in line
      printf("%s: %d -> %d", sensorNames[i], storeData[i], sensorData[i]);
      storeData[i] = sensorData[i]; // remember value
      first = false;
    }
  }
  if (!first) puts("\n"); // add a line feed if there were any changes
}

附加优势:添加第5或第6个传感器是微不足道的: - )