مجرد تقديم نفسي إلى tmping ، وصادف Quirk
-
26-09-2019 - |
سؤال
كنت أحاول فقط تعلم بناء جملة الأشياء المبتدئين ، وكيف نجحت عندما كنت أقوم بهذا القليل من التعليمات البرمجية في 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) للتغلب على هذه المشكلة ، حاول تبسيط البرنامج أو تغييره بالقرب من المواقع المذكورة أعلاه.