我的結構代碼僅僅是這樣的:未聲明的變量
typedef struct
{
int w;
int h;
float m[w][h];
} Matrix;
但我只是得到這個錯誤:
「錯誤:‘W’這裏未聲明(不在函數)」
「錯誤:'h'在此處未聲明(不在函數中)」
如何才能讓此結構正確編碼?
我的結構代碼僅僅是這樣的:未聲明的變量
typedef struct
{
int w;
int h;
float m[w][h];
} Matrix;
但我只是得到這個錯誤:
「錯誤:‘W’這裏未聲明(不在函數)」
「錯誤:'h'在此處未聲明(不在函數中)」
如何才能讓此結構正確編碼?
您的代碼不會編譯。 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;
}
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,因爲它們傾向於使數據定義不透明:如果某些東西在其他地方被聲明爲類型定義的類型,那麼理解它就是一個更復雜的結構。
在結構定義中不能有變長數組。不幸的是,你將需要使用指針。 (沿着'float * m;'接着是'Matrix foo; foo.m = malloc(foo.w * foo.h * sizeof foo.m [0]);') – 2014-10-05 18:35:41
可能是重複的 – Rustam 2014-10-05 18:39:14
中的每個數據類型C有一個固定的字節長度,這在編譯之前是已知的(整型 - 4字節,雙8字節等)。您不能有一個數據類型矩陣,它具有可變長度。 – 2014-10-05 19:24:35