2016-03-15 199 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

    是的,現在嘗試,我會將問題標記爲完成腳本升級時的回答(希望它可以正常工作) –