2016-06-17 119 views
1

好了,這裏是我的問題:如何用一個函數內的相同結構的值填充結構?

1)我已經定義了一個結構這樣說:

struct minos_model 
{ 
    int ifanis, ifdeck, npts, icb, cmb, noc; 
    double tref; 
    double r[MODEL_NPTS_MAX], rho[MODEL_NPTS_MAX], vpv[MODEL_NPTS_MAX],  vsv[MODEL_NPTS_MAX], 
    qk[MODEL_NPTS_MAX], qmu[MODEL_NPTS_MAX], vph[MODEL_NPTS_MAX],  vsh[MODEL_NPTS_MAX], eta[MODEL_NPTS_MAX]; 
    char model_name[MODEL_LINE_LEN]; 
}; 
typedef struct minos_model model_t; 

2)我已經宣佈這種形式的一些結構:

/* Declare structures */ 
model_t candidate_mod, current_mod, empty_mod; 

3)然後我將它們傳遞給一個聲明如下的函數:

void 
perturb_model(model_t *candidate_mod, model_t *current_mod, model_t *empty_mod) 
{ 
    candidate_mod = current_mod; // *THIS LINE* 
    <various other functions and whatnot> 
} 

4)然後我打電話這樣的功能:

perturb_model(&candidate_mod, &current_mod, &empty_mod); 
// arguments passed as pointers 

所以上面是我所做的簡化版本。我試圖(在線標記THIS線在步驟3)設置candidate_mod爲一個不同的結構(current_mod),我會使用一個循環,但一個,這似乎不雅,二,有時我設置它的結構也是current_mod)包含更少的值(比candidate_mod),因此我擔心原始結構(candidate_mod)的剩餘值將會保留。

我也應該提到,因爲也許它是相關的,該函數是定義在一個單獨的c文件鏈接在生成文件,所以也許共享全局有一個困難..但我認爲傳遞指針作爲參數應該解決這個?

此外,從我的研究看來,也許使用extern可能會有所幫助,但我無法弄清楚在多次嘗試之後如何使用。

如果有人能解釋做到這一點的最佳方法,我將非常感激!我知道如何在我的主代碼中輕鬆地做到這一點,但必須在函數中像這樣分配結構。

乾杯。

+0

忽略大量細節並查看問題標題。只要將它們與'structB = structA'等同起來,只要你不只是等同於指針,在這種情況下它應該是'* structB = * structA' –

回答

3

只需將src的值壓入dest,不要分配指針......但是您的真正需求並不那麼明確。

*candidate_mod = *current_mod; 
+0

因此,如果我在指針的前面放一個*一個變量或結構),它會將它返回爲變量或結構而不是它的地址? – Alex

+0

此外,這是否意味着它會改變我的主要結構的價值。事情是,我不只是想在本地而是在全球範圍內改變結構的價值。你的建議會是這種情況嗎?對不起,我正在嘗試自學,偶爾會來一個收割機。 – Alex

+1

是'* p'表示'p'指向的對象的值。當您傳遞在main中創建的對象的地址時,函數將更改該地址處的對象的值。 –

1

您正在傳遞結構的地址。當你說candidate_mod = current_mod; 你指定current_mod的地址爲candidate_mod這是不正確的。你必須使用這樣的代碼解引用該結構

*candidate_mod = *current_mod; 
+0

好的,如果我在一個指針(變量或結構的地址)前放一個*,它會將它返回到變量或結構而不是它的地址? – Alex

+0

另外,這是否意味着它會改變我主體結構的價值。事情是,我不只是想在本地而是在全球範圍內改變結構的價值。你的建議會是這種情況嗎?對不起,我正在嘗試自學,偶爾會來一個收割機。 – Alex

+0

*表示您進入您指向的地址並使用該值。指針的名稱就是您指向的元素的地址,並且當您在指針的名稱之前放*時,您將使用實際位於指向該位置的內容。是的,當你像指針參數那樣傳遞地址時,你可以改變主值,但是如果你不將它作爲指針傳遞,你不會將任何值改變成主 –