2015-04-01 65 views
2

我試圖創建一個物理組件(Arduinos)和飛行模擬器之間的接口,以便從自建部件控制和顯示模擬器事件。我已經開始在學校學習C++,但從未如此熱衷於此。
然而,我用來與我的飛行模擬器進行通信的庫是用C++編寫的(它被稱爲SimConnect),我的付費飛機的SDK也是如此。因此,我認爲它可能比創建包裝或其他編程語言更容易。沒有指針的複製結構

每次我從模擬器接收新的數據,我將它傳遞給函數ProcessNGXData

PMDG_NGX_Data* previousData; 
bool alreadyProcessed = false; 

void ProcessNGXData(PMDG_NGX_Data *data) 
{ 
    if (!alreadyProcessed || data->LTS_TaxiSw != previousData->LTS_TaxiSw) { 
     if (data->LTS_TaxiSw) 
      printf("Taxi Lights: [ON]\n"); 
     else 
      printf("Taxi Lights: [OFF]\n"); 
    } 

    if (!alreadyProcessed) { 
     alreadyProcessed = true; 
    } 
    previousData = data; 
} 

在其他編程語言,這可能會工作得很好,所以我想實現它這樣。但是,C++指針對我來說稍微複雜一點。

條件data->LTS_TaxiSw != previousData->LTS_TaxiSw從未評估爲true。根據我的理解,這是因爲datapreviousData都是指向完全相同結構的指針,因此永遠不會有所不同。

憑藉我的知識和對這些指針的理解不多,我該怎麼做?有沒有辦法複製結構,所以它們可以有所不同?

在此先感謝。

+1

如何保存'LTS_TaxiSw'的前一個'bool'值? – 2015-04-01 22:23:26

+0

這也是他們在SDK示例中所做的(他們只跟蹤兩個值)。但是,稍後會跟蹤許多結構值,我寧願不爲每一個結構值創建另一個變量。 – Padarom 2015-04-01 22:25:33

+0

我很困惑,所以你傳入'ProcessNGXData'的數據也是'previousData'? – DigitalNinja 2015-04-01 22:27:28

回答

1

如果PMDG_NGX_Data不是太大每ProcessNGXData副本,你可以試試這個:

PMDG_NGX_Data previousData; 
bool alreadyProcessed = false; 

void ProcessNGXData(PMDG_NGX_Data *data) 
{ 
    if (!alreadyProcessed || data->LTS_TaxiSw != previousData.LTS_TaxiSw) { 
     if (data->LTS_TaxiSw) 
      printf("Taxi Lights: [ON]\n"); 
     else 
      printf("Taxi Lights: [OFF]\n"); 
    } 

    if (!alreadyProcessed) { 
     alreadyProcessed = true; 
    } 
    previousData = *data; 
} 

如果它太大了,你可以創建一個結構,將僅持有你需要比較的領域,將是由PMDG_NGX_Data初始化,並且每ProcessNGXData初始化該結構。

+0

就是這樣!我沒有意識到我必須將' - >'改成'.',所以我只是混淆了'錯誤:表達式必須有一個指針類型'。謝謝 :) – Padarom 2015-04-01 22:34:41

2

聲明previousData這樣的:

PMDG_NGX_Data previousData; 

(沒有星號)。現在,當您想「保存」結構時,請執行以下操作:

previousData = *data; 

(右側帶有一個星號)。請注意,這假定PMDG_NGX_Data是可複製的和固定的大小。如果它是一個接口或一個抽象類,那麼這是不可能的。 API可能會給你一個你可以調用的「克隆」或「複製」方法。

+0

哦,而不是「previousData-> LTS_TaxiSw」,你需要做「previousData.LTS_TaxiSw」 – pharring 2015-04-01 22:32:35