2010-06-21 38 views

Trả lời

71

Tôi giả định rằng bạn đang sử dụng trình biên dịch C99 (với hỗ trợ cho mảng có kích thước động). Vấn đề trong mã của bạn là tại thời điểm khi trình biên dịch thấy khai báo biến của bạn, nó không thể biết có bao nhiêu phần tử trong mảng (tôi cũng giả định ở đây, từ lỗi trình biên dịch length không phải là hằng số biên dịch).

Bạn phải tự khởi tạo mảng:

int boardAux[length][length]; 
memset(boardAux, 0, length*length*sizeof(int)); 
+0

Tôi có thể sử dụng cho mục đích này malloc là tốt, những gì về câu hỏi thứ hai, tôi đã viết nó sau khi trả lời của Pavel – helloWorld

+0

@helloWorld: Với stack phân bổ mảng, 'printf ("% d ", boardAux [1] [2])' biên dịch khỏe. Trình biên dịch biết các kích thước và biết trong vị trí nào trong bộ nhớ phần tử (1,2) -th là. Nếu bạn sử dụng phân bổ động mảng là uni-chiều và bạn phải thực hiện các toán học mình: 'printf ("% d ", boardAux [1 * length + 2])' –

+0

@AndreyT: Cảm ơn bạn đã chỉ ra lỗi trong 'memset 'gọi ra. Tôi vừa sửa lại nó. –

-5

Bạn không thể làm điều đó. Trình biên dịch C không thể làm một điều phức tạp như vậy trên stack.

Bạn phải sử dụng phân bổ heap và động.

Những gì bạn thực sự cần phải làm:

  • kích thước tính toán (n m sizeof (element)) của bộ nhớ bạn cần
  • gọi malloc (size) để cấp phát bộ nhớ
  • tạo accessor: truy cập int * (ptr, x, y, rowSize) {return ptr + y * rowSize + x; }

Sử dụng * truy cập (boardAux, x, y, size) = 42 để tương tác với ma trận.

+0

một câu hỏi khác, tại sao tôi nhận được lỗi sử dụng không hợp lệ mảng có giới hạn không xác định? printf ("% d", bảng [i] [j]); – helloWorld

+7

-1 C99 cho phép phân bổ động trong ngăn xếp dưới dạng mã người dùng (không bao gồm việc khởi tạo). Không cần phải thực hiện phân bổ động. –

+0

@helloWorld vì thứ nguyên mảng phải được biết đến. –

17

Bạn nhận được lỗi này bởi vì trong ngôn ngữ C bạn không được phép sử dụng initializers với mảng chiều dài thay đổi. Các thông báo lỗi bạn đang nhận được về cơ bản nói tất cả.

6.7.8 Initialization

...

3 The type of the entity to be initialized shall be an array of unknown size or an object type that is not a variable length array type.

+0

Bạn đã tìm thấy điều này ở đâu, bạn có thể cho tôi một liên kết không? – helloWorld

+1

@helloWorld: Đây là từ tiêu chuẩn ngôn ngữ (C99). Bạn có thể nhận được bản sao "đang hoạt động" với các bản cập nhật TC3 tại đây http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf – AnT

+3

Có những chủ đề mà một số người sẽ luôn không tin bạn nếu bạn chỉ cung cấp lời giải thích không chính thức. Các mảng chiều dài thay đổi là một trong những chủ đề này. 1 để trích dẫn tiêu chuẩn. –

6

này cho lỗi:

int len; 
scanf("%d",&len); 
char str[len]=""; 

này cũng cho lỗi:

int len=5; 
char str[len]=""; 

Nhưng điều này hoạt động tốt:

int len=5; 
char str[len]; //so the problem lies with assignment not declaration 

Bạn cần phải đặt giá trị trong những điều sau đây cách:

str[0]='a'; 
str[1]='b'; //like that; and not like str="ab"; 
0

Đơn giản chỉ cần tuyên bố chiều dài là một khuyết điểm, nếu nó không phải là sau đó bạn nên được cấp phát bộ nhớ động

+2

Tôi nghĩ bạn cần tra cứu ý nghĩa của const! – Holger

1

Sau khi tuyên bố mảng

int boardAux[length][length]; 

cách đơn giản nhất để gán giá trị ban đầu là zero đang sử dụng cho vòng lặp, ngay cả khi nó có thể dài một chút

int i, j; 
for (i = 0; i<length; i++) 
{ 
    for (j = 0; j<length; j++) 
     boardAux[i][j] = 0; 
} 
1

Để khai báo và khởi tạo riêng biệt C++ như t của anh ấy ..

int a[n][m] ; 
a[n][m]= {0}; 
Các vấn đề liên quan