سؤال

كنت أعمل على برنامج في NetBeans على Linux باستخدام برنامج التحويل البرمجي لـ GCC عندما ، عند التبديل إلى Visual C ++ على نظام التشغيل Windows 7 ، فشل الرمز في التجميع كما يقول ذلك C ++ Visual expected constant expression على عدة خطوط. على Netbeans ، فعلت ببساطة شيء مشابه char name[fullName.size()];, ، أثناء وجوده في Visual C ++ ، حاولت ، من بين أشياء أخرى ،

const int position = fullName.size();
char Name[position];

كيف يمكنني إنشاء ثابت للاستخدام في المصفوفة؟

ملاحظة: أعرف عن هذا السؤال, ، ولكن هل هناك أي طريقة يمكنني من خلالها الحصول على هذا العمل دون استخدام المتجهات ، لأن ذلك سيتطلب إعادة كتابة العديد من أجزاء البرنامج؟

هل كانت مفيدة؟

المحلول

في VC ++ ، لا يمكنك إجراء إعلانات وقت التشغيل لأحجام صفيف المكدس ، ولكن يمكنك القيام بتخصيص المكدس عبر _alloca

إذا هذا:

const int position = fullName.size();
char Name[position];

يصبح هذا:

const int position = fullName.size();
char * Name = (char*)_alloca(position * sizeof(char));

إنه ليس نفس الشيء تمامًا ، لكنه قريب كما ستحصل على VC ++.

نصائح أخرى

هذا غير ممكن في VC ++. أنا أعلم ، حزين جدا :(

تشمل الحلول:

  • أنشئه على الكومة
  • اجعله ثابتًا

يقترح معيار C ++ الجديد (C ++ 0x) ميزة "تعبير ثابت" للتعامل مع هذا. لمزيد من المعلومات ، تحقق هذه خارج.

يتطلب C ++ أن يكون حجم الصفيف معروفًا في وقت الترجمة. إذا كنت لا تمانع في استخدام امتداد غير قياسي ، فإن GCC تسمح رمزًا كما تفعل (لاحظ أنه على الرغم من أنه ليس C ++ قياسيًا ، إلا أنه هو المعيار في ج ، اعتبارا من C99).

أظن أيضًا أنه يمكنك استخدام ناقل (في هذا المكان بالذات) مع مشكلة أقل مما تعتقد-قدر كبير من الكود المكتوب لمجموعة يمكن أن يعمل مع ناقل فقط مع إعادة الافصح ، واليتله أو لا إعادة كتابة على الإطلاق.

لك char name[fullName.size()]; هو مثال على أ صفيف طول متغير والتي - على حد علمي - ليست موحدة في C ++ ، لذا فأنت تحت رحمة المترجم. [خارج الموضوع قليلاً ، فهي جزء من معيار C99

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