سؤال

لماذا أتلقى الخطأ "قد لا يتم تهيئة كائن متغير الحجم" مع الكود التالي؟

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 للتفاعل مع المصفوفة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top