2012-12-28 29 views
-3

我有這樣一個功能:將指針傳遞給函數 - 取消引用或直接發送?

void foo(structTemp* p) 
{ 
    . 
    p->field1 = 1; 
    p->field2 = 2; 
    . 
    foo_2(?????); 
} 

void foo_2(structTemp* p, int c) 
{ 
    Need to use the pointer 'p' from foo here in this function. 
} 

我用FOO_2(P,3),但它顯示錯誤。我如何正確傳遞指針p在foo_2中使用?

編輯: 我試圖調用函數爲foo_2(p,2)或foo_2(** p,2)但出現錯誤。你能幫忙嗎?

+0

它說聲明與以前聲明的原型兼容。 – mane

+1

寫'void foo_2(structTemp * p,int c);''在'foo'上面。 – perreal

+0

我已經定義了文件頂部的原型。我仍然有問題。 – mane

回答

1

你想叫它正確的,但你可能有問題foo2沒有聲明您嘗試使用它之前的方式 - 在這種情況下,它會抱怨聲明不匹配的早期(默認)一個。

您可以檢查/或者通過改變兩個函數的順序或foo之前提供的聲明(原型),解決這個問題,使不使用默認的原型:

void foo_2 (structTemp*, int); 

所以之一:

void foo_2 (structTemp* p, int c) { 
    // Weave your magic here 
} 

void foo (structTemp* p) { 
    foo_2 (p, 3); 
} 

或:

void foo_2 (structTemp*, int); 

void foo (structTemp* p) { 
    foo_2 (p, 3); 
} 

void foo_2 (structTemp* p, int c) { 
    // Weave your magic here 
} 

會工作得很好,因爲他們BOT h涉及在第一次使用前聲明foo_2,因爲您需要它。

如果你已經有一個原型,你應該檢查它。由於您的評論包含指示編譯器抱怨不兼容聲明的文本,因此現有原型必須是不正確的。

+0

我已經在文件本身的頂部定義了原型。 line 786:Error:#159:聲明與先前的foo_2不兼容(在587聲明)void foo_2(structTemp * p,int c) 此外,我應該將foo_2作爲foo_2(* p,3)還是foo_2 (p,3)? – mane

+1

恩,@曼恩,如果你得到'聲明是不符合以前... ...',那麼要麼你沒有這樣做,要麼你已經這麼做了_incorrectly。根據你的定義,你應該使用後者(沒有解引用的裸體'p')。 – paxdiablo

+0

謝謝夥計們。原型中存在拼寫錯誤,我正確調用了該函數。 – mane

1

要在foo_2內使用p,您的操作與foo完全相同。

p->field1相同(*p).field1至極是指:該結構內的可變FIELD1指出用p。

所以,這樣的事情:

void foo(structTemp* p) 
{ 
    . 
    p->field1 = 1; 
    p->field2 = 2; 
    . 
    foo_2(p,3); 

    printf("field1 %d\nfield2 %d",p->field1, p->field2); 

} 

void foo_2(structTemp* p, int c) 
{ 
    p->field2 = 3; 
} 

將打印:

field1 1 
field2 3 

假設你的結構是這樣的:

typedef struct _t{ 

    int field1, field2; 

}structTemp; 

如果你有這個問題,可能是因爲你的變量聲明/名稱有一些錯誤。

+0

謝謝。它現在解決了,問題是一個愚蠢的拼寫錯誤!對不起,麻煩了。 – mane

+0

沒問題。 如果你完成了這個問題,關閉線程。 –