كيف أقوم بإصلاح خطأ مجلس التعاون الخليجي "للإعلان الأولي للحلقة المستخدم خارج وضع C99"؟
سؤال
أحاول حل مشكلة 3n+1 ولدي for
الحلقة التي تبدو مثل هذا:
for(int i = low; i <= high; ++i)
{
res = runalg(i);
if (res > highestres)
{
highestres = res;
}
}
لسوء الحظ، أتلقى هذا الخطأ عندما أحاول الترجمة مع دول مجلس التعاون الخليجي:
3np1.ج:15:خطأ:"من أجل" حلقة الإعلان الأولي المستخدم خارج وضع C99
لا أعرف ما هو وضع C99.أيه أفكار؟
المحلول
سأحاول أن أعلن i
خارج الحلقة!
حظا سعيدا في حل 3n+1 :-)
هنا مثال:
#include <stdio.h>
int main() {
int i;
/* for loop execution */
for (i = 10; i < 20; i++) {
printf("i: %d\n", i);
}
return 0;
}
اقرأ المزيد عن الحلقات في لغة C هنا.
نصائح أخرى
هناك مفتاح التحويل البرمجي الذي يتيح وضع C99, ، والذي يسمح، من بين أمور أخرى، بالإعلان عن متغير داخل حلقة for.لتشغيله استخدم مفتاح التحويل البرمجي -std=c99
أو كما يقولOysterD، أعلن عن المتغير خارج الحلقة.
للتبديل إلى C99 الوضع في CodeBlocks, ، اتبع الخطوات التالية:
انقر خيارات المشروع/البناء, ، ثم في علامة التبويب إعدادات المترجم اختر علامة تبويب فرعية خيارات أخرى, ، ومكان -std=c99
في منطقة النص، ثم انقر فوق نعم.
هذا سوف يتحول C99 وضع التشغيل للمترجم الخاص بك.
آمل أن يساعد هذا شخص ما!
لقد حصلت على هذا الخطأ أيضا.
for (int i=0;i<10;i++) { ..
غير صالح في معيار C89/C90.كما يقول OysterD، عليك القيام بما يلي:
int i;
for (i=0;i<10;i++) { ..
الكود الأصلي الخاص بك مسموح به في C99 والمعايير الأحدث للغة C.
ميزات جديدة في C99
- وظائف مضمنة
- لم يعد إعلان المتغير يقتصر على نطاق الملف أو بداية العبارة المركبة
- العديد من أنواع البيانات الجديدة، بما في ذلك int long long، وأنواع الأعداد الصحيحة الموسعة الاختيارية، ونوع بيانات منطقية صريحة، ونوع معقد لتمثيل الأعداد المركبة
- المصفوفات ذات الطول المتغير
- دعم التعليقات المكونة من سطر واحد والتي تبدأ بـ //، كما هو الحال في BCPL أو C++
- وظائف المكتبة الجديدة، مثل snprintf
- ملفات الرأس الجديدة، مثل stdbool.h وinttypes.h
- وظائف الرياضيات العامة من النوع (tgmath.h)
- تحسين الدعم للنقطة العائمة IEEE
- المُهيئات المعينة
- حرفية مركبة
- دعم وحدات الماكرو المتغيرة (وحدات الماكرو ذات التصميم المتغير)
- تقييد التأهيل للسماح بتحسين التعليمات البرمجية بشكل أكثر قوة
إذا قمت بتجميع التغيير في C
for (int i=0;i<10;i++) { ..
ل
int i;
for (i=0;i<10;i++) { ..
يمكنك أيضًا التجميع باستخدام مجموعة التبديل C99.ضع -std=c99 في سطر الترجمة:
gcc -std=c99 foo.c -o foo
المرجع: http://cplusplus.syntaxerrors.info/index.php?title="من أجل"_loop_initial_declaration_used_outside_C99_mode
واجهت نفس المشكلة وهي تعمل عليك فقط أن تعلن عن i
خارج الحلقة:
int i;
for(i = low; i <= high; ++i)
{
res = runalg(i);
if (res > highestres)
{
highestres = res;
}
}
لأي شخص يحاول تجميع التعليمات البرمجية من مصدر خارجي يستخدم أداة بناء آلية مثل يصنع, ، لتجنب الاضطرار إلى تعقب مكالمات التحويل البرمجي الصريحة لدول مجلس التعاون الخليجي، يمكنك تعيين متغير بيئة.أدخل في موجه الأوامر أو أدخل .bashrc (أو .bash_profile على نظام Mac):
export CFLAGS="-std=c99"
لاحظ أن الحل المماثل ينطبق إذا واجهت سيناريو مشابهًا مع تجميع C++ الذي يتطلب C++ 11، فيمكنك استخدام:
export CXXFLAGS="-std=c++11"
بالنسبة إلى Qt-Creator:فقط أضف الأسطر التالية إلى ملف *.pro ...
QMAKE_CFLAGS_DEBUG = \
-std=gnu99
QMAKE_CFLAGS_RELEASE = \
-std=gnu99
أجابت جيهين ستامبولي على سؤال OP بشكل مباشر ...كان السؤال؛لماذا
for(int i = low; i <= high; ++i)
{
res = runalg(i);
if (res > highestres)
{
highestres = res;
}
}
إنتاج الخطأ؛
3np1.c:15: error: 'for' loop initial declaration used outside C99 mode
الذي هو الجواب
for(int i = low...
يجب ان يكون
int i;
for (i=low...