إنشاء صفيف مع ثابت
-
21-09-2019 - |
سؤال
كنت أعمل على برنامج في 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