繁体   English   中英

按名称访问结构变量

[英]Access struct variable by its name

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

我以前从未使用过“动态”参数,因此我正在寻求有关此参数的帮助。

感谢您的关注,并感谢您对本主题的任何帮助!

您有两个基本选项:

  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 ,您可以轻松地在地图中查找该传感器的值(当然是在检查它是否存在之后)。

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

     static struct { const char *name; double SensorReadings::*value; } sensor_names[]={ { "Dp", &SensorReadings::Dp }, { "Dta", &SensorReadings::Dta }, };

您可以使用此表将传感器名称映射到类成员。 这有点难看,但它是可行的。 我更喜欢使用第一个选项,我自己。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM