2013-10-15 102 views
1

我想創建一個函數,它爲在「main」中定義的結構數組分配內存。問題似乎是我的功能不能識別結構。下面的代碼有什麼問題?如何正確定義由函數返回的結構?

#include <math.h> 
#include <stdio.h> 
#include <stdlib.h> 

typedef struct typecomplex { float r; float i; } complex; 
complex *myfunction(int n); 

int main (int argc, char *argv[]) { 
    complex *result = myfunction(1000); 
    exit(0); 
} 

...而在另一個文件...

struct complex *myfunction(int n) { 
    complex *result = (complex *)malloc(n*sizeof(*complex)); 
    if(result==NULL) return(NULL); 
     else return(result); 
} 
+0

你在看什麼? –

+0

你的'struct'被稱爲'_complex'。你爲什麼用那些髒的'typedefs'搞砸?此外,在這種情況下,您應該將'struct's' deffinition移動到* .h文件以包含在兩個* .c文件中。 – Kamiccolo

+0

錯誤:'複雜'未聲明(首次在此函數中使用) – JWDN

回答

2

大廈fvdalcin的回答是:

myprog.c中:

#include <math.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include "mycomplex.h" 


int main (int argc, char *argv[]) { 
    complex *result = myfunction(1000); 
    exit(0); 
} 

mycomplex.h:

#ifndef __MYCOMPLEX_H__ 
typedef struct typecomplex { float r; float i; } complex; 
complex *myfunction(int n); 
#define __MYCOMPLEX_H__ 
#endif 

(#ifdef是一個很好的我DEA保持它被包含超過一次)

mycomplex.c:這裏

#include <stdlib.h> 
#include "mycomplex.h" 

complex *myfunction(int n) { 
    complex *result = malloc(n*sizeof(complex)); 
    if(result==NULL) return(NULL); 
     else return(result); 
} 

注意微妙但重要的修正 - 的MyFunction的sizeof(複雜)代替的sizeof(複雜*),聲明()不包含關鍵字「struct」,並且不在malloc()上強制轉換 - 它不需要一個,並且可以隱藏包含文件原型的缺失(請參見Do I cast the result of malloc?)。 myfunction()實際上可以簡化爲一行:

return malloc(n*sizeof(complex)); 
1

移動該聲明typedef struct _complex { float r; float i; } complex;到 「其他」 文件。該其他文件必須是您的foo.h文件,該文件具有等效的foo.c,該文件實現了foo.h中聲明的方法。然後,您可以簡單地將foo.h添加到您的main.c文件中,並且一切都會正常工作。

1

下面是一個更正代碼編譯好:

typedef struct typecomplex { float r; float i; } complex; 
complex *myfunction(int n) {   
    complex *result = (complex *)malloc(n*sizeof(complex)); //removed * from sizeof(*complex) 
    if(result==NULL) return(NULL); 
     else return(result); 
} 

int main (int argc, char *argv[]) { 
    complex *result = myfunction(1000); 
    exit(0); 
} 
+0

感謝您捕捉*。這將工作,但我需要在一個單獨的文件中的功能,所以許多程序可以調用它:) – JWDN