2016-03-15 170 views
1

即时通讯尝试创建程序,它将与CSV文件中提供的数据一起使用。访问结构变量的名称

到目前为止,我已经制作了这个CSV文件的结构,并能够用它的数据填充向量。

我试图实现的是允许用户输入传感器名称并使用给定的传感器列表对其进行检查。

我想要做的是在用户输入传感器名称后,访问已创建的矢量数据并显示该特定传感器的数据。

这里是我所做的结构:

typedef struct SensorReadings { 
    int Month; 
    int Day; 
    double Dp;     // Dew Point Temperature 
    double Dta;     // Wind Direction (10min Avg) 
    double Dts;     // Wind Direction (10min SD) 
    double EV;     // Evaporation (Year to Date) 
    double QFE;     // Barometric Pressure 
    double QFF;     // Barometric Pressure (QFE*Kqff) 
    double QNH;     // Barometric Pressure (Aviation Standard) 
    double RF;     // Rainfall (Year to Date) 
} SensorReadings; 

这里是代码,在这里我提示用户输入传感器名称:

std::cout << std::endl << std::endl << "Available Sensors: " << std::endl; 
std::cout << "Dp Dta Dts EV QFE QFF QNH RF" << std::endl << std::endl; 
do { 
    std::cout << "Please select Sensor you want to work with: "; 
    std::cin >> selectedSensor; 

    isSensorValid = std::find(std::begin(availableSensors), std::end(availableSensors), selectedSensor) != std::end(availableSensors); 
} while(!isSensorValid); 

我也做了一个方法来获得平均全年数据每日价值:

double getAverageReadings(int wDay, int wMonth) { 
    std::vector<SensorReadings> pData = fm.parsedFile; 
    double DewPointTemperature = 0.0; 
    for(int r = 0; r < pData.size(); r++) { 
     if(pData[r].Month == wMonth) { 
      if(pData[r].Day == wDay) { 
       if(pData[r].Dp >= 100) 
        DewPointTemperature = DewPointTemperature + cWTKW(pData[r].Dp); 
      } 
     } 
    } 
    return DewPointTemperature; 
} 

此功能可以让我获得每天的日平均值n各自每月露点温度,我想要做的寿,什么是可以做这样的事情:

double getAverageReadings(int wDay, int wMonth, std::string selectedSensor) { 
    /* 
     Magic to convert std::string to actual Structure parameter 
     Pseudo: 
     param Sensor = convert(selectedSensor, to SensorReadingsParam); 
    */ 
    std::vector<SensorReadings> pData = fm.parsedFile; 
    double averageReadingsForSensor = 0.0; 
    for(int r = 0; r < pData.size(); r++) { 
     if(pData[r].Month == wMonth) { 
      if(pData[r].Day == wDay) { 
       if(pData[r].Sensor >= 100) 
        averageReadingsForSensor = averageReadingsForSensor + cWTKW(pData[r].Sensor); 
      } 
     } 
    } 
    return averageReadingsForSensor; 
} 

我从来没有使用之前,“动态”参数来工作,所以即时通讯寻求帮助这一个。

感谢您的关注,以及对此主题的任何帮助!

回答

1

你有两个基本的选择:

  1. ,而不用声明一个明确的变量每个“传感器”的,使用std::map

    typedef struct SensorReadings { 
        int Month; 
        int Day; 
        std::map<std::string, double> sensor_value; 
    } SensorReadings; 
    

,并存储在地图中的每个传感器值,通过传感器名称键控,即sensor_value["Dp"]sensor_value["Dta"],等等。

然后,给定传感器名称std::string sensor_name,您可以轻松地在地图中查找该传感器的值(当然,在检查它存在之后)。

  • 第二个选择是保持传感器名称的单独列表,和一个指向对应的类部件,是这样的:

    static struct { 
        const char *name; 
        double SensorReadings::*value; 
    } sensor_names[]={ 
        { "Dp", &SensorReadings::Dp }, 
        { "Dta", &SensorReadings::Dta }, 
    }; 
    
  • 而您可以使用此表将传感器名称映射到类成员。这有点丑陋,但它是可行的。我宁愿使用第一个选项,我自己。

    +0

    感谢您的快速回复。但是,内存使用有一个小问题。它从14Mb上升到173Mb,处理时间从现在的27秒变为未知(仍在运行)。这里有一个有趣的东西,解析是在8核CPU上进行的。也许我应该注意到,csv文件包含了500,000行,平均线长度为105-130个符号 –

    +0

    是的,也许你应该提到这一点。这就是为什么我给了第二个选项,它不需要改变班级,以换取更多的工作来访问班级成员,按名称。加载此数据的代码的另一种可能性不是非常有效。 –

    +0

    是的,现在尝试,我会将问题标记为完成脚本升级时的回答(希望它可以正常工作) –