2014-10-05 186 views
1

我的結構代碼僅僅是這樣的:未聲明的變量

typedef struct 
{ 
    int w; 
    int h; 
    float m[w][h]; 
} Matrix; 

但我只是得到這個錯誤:
「錯誤:‘W’這裏未聲明(不在函數)」
「錯誤:'h'在此處未聲明(不在函數中)」

如何才能讓此結構正確編碼?

+6

在結構定義中不能有變長數組。不幸的是,你將需要使用指針。 (沿着'float * m;'接着是'Matrix foo; foo.m = malloc(foo.w * foo.h * sizeof foo.m [0]);') – 2014-10-05 18:35:41

+0

可能是重複的 – Rustam 2014-10-05 18:39:14

+0

中的每個數據類型C有一個固定的字節長度,這在編譯之前是已知的(整型 - 4字節,雙8字節等)。您不能有一個數據類型矩陣,它具有可變長度。 – 2014-10-05 19:24:35

回答

0

您的代碼不會編譯。 C不同於Java和高級語言。

typedef struct 
{ 
    int w; 
    int h; 
    float **elements; 
} Matrix; 


Matrix* initializeMatrix(int w,int h){ 

Matrix * matrix; 
int i,j; 
if(NULL == (matrix = malloc(sizeof(Matrix)))) { 
    printf("malloc failed\n"); 
    return NULL; 
} 

matrix.w=w; 
matrix.h=h; 

if(NULL == (matrix->elements = malloc(w * sizeof(float*)))) { 
    printf("malloc failed\n"); 
    free(matrix); 
    return NULL; 
    } 

for(i = 0; i< matrix.w ; i++){ 
    if(NULL == (matrix->elements[i] = malloc(h * sizeof(float)))) { 
    printf("malloc failed\n"); 
    for(j = i ; j>=0 ; j--) 
    free(matrix->elements[j]); 
    free(matrix); 
    return NULL; 
    } 
} 

return matrix; 
} 
1

Muli的答案顯示瞭如何解決您的問題。下面是對編譯失敗的解釋:編譯器不知道每個Matrix結構聲明分配多少內存的邊界在哪裏,因爲在編譯時不知道尺寸(w和h的值)。當第m陣列的最大尺寸在構建時知道的,您可以使用預定義的大小結構,像

#define MAX_W 10 
#define MAX_H 10 

struct { 
    int w; 
    int h; 
    float m[MAX_W][MAX_H]; 
}; 

struct matrix my_matrix; 
... 

事後你可以聲明,當你想使用矩陣結構。 這種方法的缺點是分配內存超過必要的成本。

繼linux內核編碼gudelines之後,我不喜歡typedef,因爲它們傾向於使數據定義不透明:如果某些東西在其他地方被聲明爲類型定義的類型,那麼理解它就是一個更復雜的結構。