سؤال

كنت أحاول فقط تعلم بناء جملة الأشياء المبتدئين ، وكيف نجحت عندما كنت أقوم بهذا القليل من التعليمات البرمجية في VS2008. يعمل الرمز أدناه في إضافة أرقام من 1 إلى 499 ، ولكن إذا قمت بإضافة 1 إلى 500 ، فإن الحجاب المترجم يمنحني:

fatal error C1001: An internal error has occurred in the compiler.

وكنت أتساءل فقط لماذا هذا. هل هناك بعض الحد من كمية الرمز الذي يمكن أن ينشئه برنامج التحويل البرمجي أو شيء ما ، وقد حدث لي أن يكون عدد جولة لطيفة من 500 بالنسبة لي؟

#include <iostream>
using namespace std;

template < int b >
struct loop {
    enum { sum = loop< b - 1 >::sum + b };
};

template <>
struct loop< 0 > {
    enum { sum = 0 };
};

int main() {
    cout << "Adding the numbers from 1 to 499 = " << loop< 499 >::sum << endl;
    return 0;
}
هل كانت مفيدة؟

المحلول

أفترض مع GCC (وبالتالي G ++) عمق عودة القالب الافتراضي هو 500 كما على الأقل على جهازك ، تمكنت من إعادة إنتاج مشاكلك برسالة تحذير (أفضل قليلاً). التجميع loop<500>::sum عملت بشكل جيد ولكن محاولة التجميع loop<501>::sum باءت بالفشل.

إذا كنت تستخدم GCC (أو G ++) ، فإن الحل هو تجميعه به -ftemplate-depth-## (حيث ## هو الحد الأقصى للعمق المسموح به).

على سبيل المثال لتجميع main.cpp مع أقصى عمق تكرار القالب لعام 2000

g++ -ftemplate-depth-2000 main.cpp

أو تحويل الرمز إلى هذا:

template < int b >
struct loop {
    enum { sum = (b*(b+1))/2 };
};

(لكنني سأعترف بأن الكود أعلاه لا يساعدك على التعرف على القالب المتصاعد)

نصائح أخرى

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

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

عند الإبلاغ عن مثل هذا الخطأ (هنا أو في أي مكان آخر) ، يجب ألا تفشل أبدًا في توفير إصدار المترجم الدقيق الذي استخدمته.

انظر في نافذة الإخراج:

C: Projects cpptemp3 cpptemp3.cpp (9):
خطأ فادح C1001: حدث خطأ داخلي في المترجم. (ملف التحويل البرمجي 'msc1.cpp' ، السطر 1411) للتغلب على هذه المشكلة ، حاول تبسيط البرنامج أو تغييره بالقرب من المواقع المذكورة أعلاه.

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