2011-06-03 40 views
0

使用的結構我使用的是結構,如如何multple功能

struct IF_ID { 
    int PC; 
    string instruction; 
    }; 

然後在

int main() 
    { 
    IF_ID stage1; 
    stage1.PC=0; 
    FETCH(stage1); 
    DECODE(&stage1); 
    return 0; 
    } 

當我在FETCH(stage1)功能它工作正常過時stage1,東西是我需要在FETCH(stage1)中計算出的值再次用於第二個函數DECODE(stage1) 因此如果stage1.PC等於5例如我需要在DECODE(stage1)功能我該怎麼做?

回答

3

您正在通過值將結構傳遞給FETCH()。
這意味着它被複制到該函數。

如果你想實際的結構來進行傳遞,你需要的方法來接收它的指針或引用:

通過參考:

void FETCH(IF_ID& ref_stage); 

指針結構:

void FETCH(IF_ID* ref_stage); 

如果通過引用使用,內部函數語義不會改變。

+0

我試過你說的,但它給了我一個錯誤<錯誤C2664:'FETCH':不能將參數1從'IF_ID *'轉換爲'IF_ID&'> – Shadi 2011-06-03 15:35:49

+0

如果您使用的是refence類型,應該通過變量而不及....獲取(階段1)......那是因爲獲取(階段1 - )是指通過變量的指針(地址) – 2011-06-03 15:40:20

+0

感謝ü感謝感謝ü它的工作 – Shadi 2011-06-03 15:41:31

0

如果您想要FETCH更改參數的值,它應該接受引用或指向結構的指針作爲參數。或者它可以返回一個實例IF_ID

0

解決方案是通過stage1作爲FETCH()函數的參考。函數簽名看起來應該喜歡這樣:

void FETCH(IF_ID& stage); 

或像這樣:

void FETCH(IF_ID* stage); 
在後一種情況下

,函數調用也需要在參數前面的&符號:

FETCH(&stage1); 
+0

我想什麼ü說,但它給我一個錯誤 Shadi 2011-06-03 15:34:42

+0

,你必須調用它如果'id'是一個指針,則用'FETCH(* id)'。 – Constantinius 2011-06-03 18:57:09

0

不完全確定你要做什麼,但讓我猜。

您有一個類型和兩個函數(FETCH和DECODE),它們對該類型的輸入參數進行操作。第一個函數修改輸入參數,並且希望將修改後的值用作第二個函數的輸入。

也許你應該聲明函數爲(讓我們稱你的類型爲T,因爲這可能適用於任何複雜的類型或類)。

void FETCH(T &x); 

這樣,類型T的參數x通過引用傳遞。在函數體內執行的修改將影響函數以外的結果

然後你可以聲明第二個功能:

void DECODE(const T &y); 

在這裏,我們再次引用傳遞的複雜類型,但這個時候你承諾,你不會修改它(常量)。

0

尤查蒂默和其他幾個人的答案是正確的,但也考慮讓你的結構爲一類,並使之類的這些功能的成員,因爲它們主要操作它。然後代碼會看起來像:

int main() 
{ 
    IF_ID stage1; 
    stage1.PC=0; 
    stage1.FETCH(); 
    stage1.DECODE(); 
} 

但是,如果FETCH使用沒有IF_ID,除了PC的價值,並根據你的代碼是如何組織的,它可能是更清晰,使fetch構造的對象,而。不必傳入的一個 「空白」 的對象。例如,像:

結構IF_ID { INT PC; 字符串指令; IF_ID():PC(0){} //確保默認具有PC = 0 };

IF_ID取(){ IF_ID的stage1; //取東西並放入stage1 return stage1; //如果IF_ID是一大類昂貴的複製, //請確保您的編譯器支持「命名返回 //價值優化」,即。不會在成員變量 //和返回值之間產生 //多餘的副本。 }

int main(){ IF_ID stage1 = Fetch(); 解碼(stage1); }