2013-05-21 3 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

Является ли struct _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

Было бы хорошо, если бы я создавал 'struct LandR LRChannels' в начале' main.c', а затем передавал LRChannels функции в качестве аргумента и после этого возвращал эту структуру, которая включает в себя 2 массива (каналы)? – yulian

+1

@Julian Определите структуру в заголовке вместо этого. Включите заголовок, когда/где это необходимо. –

1

Чуть больше объяснений (которые должны быть доступны в любом хорошем учебнике, а):

Положите все, что должно присутствовать в нескольких местах в .h файл. То есть, главным образом, extern деклараций переменных, прототипов функций, typedefs, structs, enums и т. Д.

Поместите фактический код каждой функции в файл .c. Позвольте им включить необходимые файлы .h и только нужные.

Предотвращение множественного включения файлов заголовков с помощью include guard.

Смежные вопросы