เหตุใดฉันจึงได้รับข้อผิดพลาด "Variable-sized object may not be initialized" พร้อมรหัสต่อไปนี้
int boardAux[length][length] = {{0}};
เหตุใดฉันจึงได้รับข้อผิดพลาด "Variable-sized object may not be initialized" พร้อมรหัสต่อไปนี้
int boardAux[length][length] = {{0}};
enum {length = 0xF } ; int boardAux[length][length] = {0};
คำตอบ:
ฉันสมมติว่าคุณใช้คอมไพเลอร์ C99 (พร้อมการรองรับอาร์เรย์ขนาดไดนามิก) ปัญหาในโค้ดของคุณคือในเวลาที่คอมไพเลอร์เห็นการประกาศตัวแปรของคุณมันไม่สามารถรู้ได้ว่ามีองค์ประกอบในอาร์เรย์กี่องค์ประกอบ (ฉันสมมติที่นี่จากข้อผิดพลาดของคอมไพเลอร์ที่length
ไม่ใช่ค่าคงที่ของเวลาในการคอมไพล์)
คุณต้องเริ่มต้นอาร์เรย์นั้นด้วยตนเอง:
int boardAux[length][length];
memset( boardAux, 0, length*length*sizeof(int) );
printf( "%d", boardAux[1][2] )
คอมไพล์ได้ดี คอมไพเลอร์รู้ขนาดและรู้ว่าตำแหน่งใดในหน่วยความจำองค์ประกอบ (1,2) -th คืออะไร หากคุณใช้การจัดสรรแบบไดนามิกอาร์เรย์จะเป็นมิติเดียวและคุณต้องคำนวณด้วยตัวเอง:printf("%d", boardAux[ 1*length + 2 ])
memset
โทรออก ฉันเพิ่งแก้ไขมัน
length
จะเป็นstatic
? ใน C ++ 14 ทำงานได้ดี
malloc
ไม่จำเป็นต้องใช้
คุณได้รับข้อผิดพลาดนี้เนื่องจากในภาษา C คุณไม่ได้รับอนุญาตให้ใช้ initializers กับอาร์เรย์ที่มีความยาวผันแปรได้ ข้อความแสดงข้อผิดพลาดที่คุณได้รับโดยทั่วไปกล่าวได้ทั้งหมด
6.7.8 การเริ่มต้น
...
3 ประเภทของเอนทิตีที่จะเริ่มต้นจะต้องเป็นอาร์เรย์ที่ไม่ทราบขนาดหรือประเภทวัตถุที่ไม่ใช่ประเภทอาร์เรย์ที่มีความยาวตัวแปร
สิ่งนี้ทำให้เกิดข้อผิดพลาด:
int len;
scanf("%d",&len);
char str[len]="";
สิ่งนี้ยังทำให้เกิดข้อผิดพลาด:
int len=5;
char str[len]="";
แต่ใช้งานได้ดี:
int len=5;
char str[len]; //so the problem lies with assignment not declaration
คุณต้องใส่มูลค่าด้วยวิธีต่อไปนี้:
str[0]='a';
str[1]='b'; //like that; and not like str="ab";
หลังจากประกาศอาร์เรย์
int boardAux[length][length];
วิธีที่ง่ายที่สุดในการกำหนดค่าเริ่มต้นเป็นศูนย์คือการใช้สำหรับลูปแม้ว่าอาจจะยาวไปหน่อยก็ตาม
int i, j;
for (i = 0; i<length; i++)
{
for (j = 0; j<length; j++)
boardAux[i][j] = 0;
}
memset
ง่ายขึ้นและเร็วขึ้น
คำถามได้รับคำตอบแล้ว แต่ฉันต้องการชี้ให้เห็นวิธีแก้ปัญหาอื่นที่รวดเร็วและใช้งานได้ถ้าความยาวไม่ได้หมายถึงการเปลี่ยนแปลงในเวลาทำงาน ใช้มาโคร #define ก่อน main () เพื่อกำหนดความยาวและใน main () การเริ่มต้นของคุณจะทำงาน:
#define length 10
int main()
{
int boardAux[length][length] = {{0}};
}
มาโครถูกเรียกใช้ก่อนการคอมไพล์จริงและความยาวจะเป็นค่าคงที่เวลาคอมไพล์ (ตามที่ David Rodríguezอ้างในคำตอบของเขา) มันจะแทนความยาวด้วย 10 ก่อนคอมไพล์
{0}
และ{{0}}
?
อาร์เรย์ไม่ได้เริ่มต้นด้วยหน่วยความจำที่ระบุ anf แสดงข้อผิดพลาด
variable sized array may not be initialised
ฉันชอบวิธีการเริ่มต้นตามปกติ
for (i = 0; i <= bins; i++)
arr[i] = 0;
เพียงแค่ประกาศความยาวเป็นข้อเสียหากไม่เป็นเช่นนั้นคุณควรจัดสรรหน่วยความจำแบบไดนามิก
const int lenght=5; int array[length][length] = {{0}};
จะไม่
int size=5;
int ar[size ]={O};
/* This operation gives an error -
variable sized array may not be
initialised. Then just try this.
*/
int size=5,i;
int ar[size];
for(i=0;i<size;i++)
{
ar[i]=0;
}
สำหรับการประกาศแยก C ++ และการเริ่มต้นเช่นนี้ ..
int a[n][m] ;
a[n][m]= {0};
คุณไม่สามารถทำได้. คอมไพเลอร์ C ไม่สามารถทำสิ่งที่ซับซ้อนบนสแต็กได้
คุณต้องใช้ฮีปและการจัดสรรแบบไดนามิก
สิ่งที่คุณต้องทำ:
ใช้ * access (boardAux, x, y, size) = 42 เพื่อโต้ตอบกับเมทริกซ์