خطأ في ترجمة C: "قد لا يتم تهيئة كائن متغير الحجم"
-
28-09-2019 - |
سؤال
لماذا أتلقى الخطأ "قد لا يتم تهيئة كائن متغير الحجم" مع الكود التالي؟
int boardAux[length][length] = {{0}};
المحلول
أفترض أنك تستخدم برنامج التحويل البرمجي C99 (بدعم من المصفوفات ذات الحجم الديناميكي). المشكلة في الكود الخاص بك هي أنه في الوقت الذي يرى فيه المجمعون إعلانك المتغير ، لا يمكن أن يعرف عدد العناصر الموجودة في الصفيف (أنا أيضًا أفترض هنا ، من خطأ المترجم length
ليس ثابت وقت الترجمة).
يجب عليك تهيئة تلك الصفيف يدويًا:
int boardAux[length][length];
memset( boardAux, 0, length*length*sizeof(int) );
نصائح أخرى
تتلقى هذا الخطأ لأنه في لغة C لا يُسمح لك باستخدام المهيئات ذات المصفوفات المتغيرة الطول. رسالة الخطأ التي تحصل عليها بشكل أساسي تقول كل شيء.
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;
}
ما عليك سوى إعلان الطول ليكون سلبيات ، إذا لم يكن الأمر كذلك ، فيجب عليك تخصيص الذاكرة بشكل ديناميكي
ل C ++ إعلان منفصل وتهيئة مثل هذا ..
int a[n][m] ;
a[n][m]= {0};
انت لا تستطيع فعلها. لا يمكن لبرنامج التحويل البرمجي C القيام مثل هذا الشيء المعقد على المكدس.
عليك استخدام الكومة والتخصيص الديناميكي.
ما عليك فعله حقًا:
- حساب الحجم (نمحجم (عنصر)) من الذاكرة التي تحتاجها
- اتصل بـ malloc (الحجم) لتخصيص الذاكرة
- إنشاء ملحق: int* Access (PTR ، X ، Y ، Rowsize) {return Ptr + y* rowsize + x ؛ }
استخدم *Access (boardaux ، x ، y ، size) = 42 للتفاعل مع المصفوفة.