2013-05-21 120 views
3

我不明白這是什麼意思:錯誤:返回類型是一個不完全類型

error: return type is an incomplete type" 

我只是想返回結構。我分開了兩個音頻通道,我想使用唯一的函數使用結構返回它們。

的main.c

#include "functions.h" 
... 
struct LandR sepChannels_8(unsigned char *, unsigned long, unsigned char *, unsigned char *); 
... 
int main() 
{ 
    ... 

    sepChannels_8(ptrSamples_8, n, ptrSamples_8_L, ptrSamples_8_R); 

    ... 
} 

function.h

... 
struct LandR sepChannels_8(unsigned char *smp, unsigned long N, unsigned char *L, unsigned char *R) 
{ 
    struct LandR 
{ 
    unsigned char *L; 
    unsigned char *R; 
}; 
struct LandR LRChannels; 

int i; 

if (N % 2 == 0) 
{ 
    L = malloc(N/2); 
    R = malloc(N/2); 
} 
else 
    if (N % 2 == 1) 
    { 
     L = malloc(N/2); 
     R = malloc(N/2); 
    } 

for (i = 0; i < N; i++) // separating 
{ 
    L[2 * i + 0] = smp[2 * i + 0]; 
    R[2 * i + 0] = smp[2 * i + 1]; 
} 
return LRChannels; 
} 
... 
+3

結構_defined_在你嘗試使用它的地步嗎?這是你的示例代碼中的拼寫錯誤,還是你真的想在函數本身中定義函數的返回類型? –

+4

您對'.c'和'.h'文件的使用非常倒退 - 您在'main.c'中創建了原型,在'function.h'中創建了函數體。但是你確實設法把'main'放在'main.c'中。 –

回答

4

如果你想使用一個類型,你需要先聲明它。

struct LandR在本地聲明爲sepChannels_8

將聲明移入全局範圍,如果您想將其作爲函數的返回類型公開。


另外:按照慣例原型,常數和類型定義進入.h文件。實現進入.c文件。

+1

你想說我必須:在'.h'中聲明變量,函數的原型並在'.c'中實現這些函數? – yulian

+0

是的,這是有效的。 – alk

1

看來,該結構的完整聲明是不存在的,只有一個向前聲明(如struct foo; ),所以返回類型是不完整的 - 你不能這樣做。

+0

如果我在'main.c'的開頭創建'struct LandR LRChannels',然後將LRChannels傳遞給一個函數作爲參數,並且在返回包含2個數組(通道)的結構之後會好嗎? – yulian

+1

@Julian改爲在頭部定義結構。在需要/需要時包含標題。 – 2013-05-21 17:52:14

1

多一點解釋(這應該在每一個優秀的C教程也是可用的):

把一切都必須出現在幾個地方爲.h文件的內容。也就是說,主要是extern變量的聲明,函數原型,typedef,結構體,枚舉等。

把每個函數的實際代碼放到一個.c文件中。讓他們包含所需的.h文件並僅包含所需的文件。

防止將頭文件與include guard多個包含在一起。