我有四个不同的传感器,并将它们记录的值存储在结构中。现在我想每分钟打印这些值。但只有与上次打印相比发生变化的值!
struct SensorData{
uint8_t temp; //temperature
uint8_t pres; //presure
uint8_t hum; //humidity
uint8_t fuel; //fuel
};
我用15个ifs解决了这个问题。但这有点难以阅读和调试。所以,如果有更好,更优雅的方法来解决这个问题,我会更加努力。
所有可能性的表:如果值与之前的值不同则为1,如果它们相同则为0:
这就是我现在用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。谢谢你的帮助
答案 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个传感器是微不足道的: - )