按名称访问struct变量

时间:2016-03-15 01:39:50

标签: c++ csv vector struct structure

我正在尝试创建可以使用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;
}

这个功能让我可以获得 露点温度 每个月的每日平均值,我想做的就是做类似的事情。这样:

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;
}

我从未习惯使用动态&#39;参数之前,所以即时通讯寻求帮助。

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

1 个答案:

答案 0 :(得分:1)

您有两个基本选项:

  1. 不要为每个“传感器”声明一个显式变量,而是使用std::map

    typedef struct SensorReadings {
        int Month;
        int Day;
        std::map<std::string, double> sensor_value;
    } SensorReadings;
    
  2. 并将每个传感器值存储在地图中,并按传感器名称键入,即sensor_value["Dp"]sensor_value["Dta"],等等。

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

    1. 第二个选项是维护一个单独的传感器名称列表,以及指向相应类成员的指针,如:

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