2008-08-24 28 views
102

मैं the 3n+1 problem हल करने के लिए कोशिश कर रहा हूँ और मैं एक for पाश है कि इस तरह दिखता है:मैं "सीओएस मोड के बाहर प्रयुक्त लूप प्रारंभिक घोषणा के लिए" कैसे ठीक करूं "जीसीसी त्रुटि?

3np1.c:15: error: 'for' loop initial declaration used outside C99 mode

मैं:

for(int i = low; i <= high; ++i) 
     { 
       res = runalg(i); 
       if (res > highestres) 
       { 
         highestres = res; 
       } 

     } 

दुर्भाग्य से जब मैं जीसीसी के साथ संकलन करने की कोशिश मैं इस त्रुटि मिल रही है पता नहीं क्या सी 99 मोड है। कोई विचार?

उत्तर

125

मैं लूप के बाहर i घोषित करने का प्रयास करूंगा! सी here में छोरों के लिए और अधिक पर

#include <stdio.h> 

int main() { 

    int i; 

    /* for loop execution */ 
    for (i = 10; i < 20; i++) { 
     printf("i: %d\n", i); 
    } 

    return 0; 
} 

पढ़ें:

सुलझाने 3n + 1 :-)

यहाँ पर गुड लक एक उदाहरण है।

+0

तो आप इसके बजाय लूप के दौरान क्यों उपयोग नहीं करते? –

102

एक कंपाइलर स्विच है जो C99 mode को सक्षम बनाता है, जो अन्य चीजों के साथ लूप के अंदर एक चर की घोषणा की अनुमति देता है। इसे कंपाइलर स्विच -std=c99

या @OysterD कहते हैं, लूप के बाहर चर घोषित करने के लिए इसे चालू करने के लिए।

+7

असल में -std = gnu99 शायद अधिक वांछनीय है क्योंकि आप अभी भी जीसीसी एक्सटेंशन प्राप्त करते हैं (gcc डिफ़ॉल्ट -std = gnu89 पर डिफ़ॉल्ट है, हालांकि यह अगले कुछ संस्करणों में किसी बिंदु पर gnu99 में बदल जाएगा) – Spudd86

+3

@ Spudd86: चाहे आप * चाहते हैं * जीसीसी एक्सटेंशन को सक्षम करने के लिए आप जो कर रहे हैं उस पर निर्भर करता है। उन्हें अक्षम करना सहायक होता है यदि आपका लक्ष्य कोड लिखना है जो जीसीसी के अलावा अन्य कंपाइलर्स को पोर्टेबल है। –

14

मुझे यह त्रुटि भी मिली है।

for (int i=0;i<10;i++) { .. 

C89/C90 मानक में मान्य नहीं है। OysterD कहते हैं, तुम क्या करने की जरूरत है:

int i; 
for (i=0;i<10;i++) { .. 

आपका मूल कोड C99 और सी भाषा के बाद के स्तर में अनुमति दी है।

+3

जीसीसी के लिए, इसे "-std = c99" फेंक दें। अतिरिक्त सुविधाओं के लिए, इमरान का जवाब देखें। –

+0

हां, यह वैध सी है; यह सिर्फ वैध C89/C90 मान्य नहीं है। –

+0

@ किथ थॉम्पसन: स्पष्ट। – Blorgbeard

13

@Blorgbeard:

C99

में नई सुविधाएँ
  • इनलाइन कार्यों
  • चर घोषणा नहीं रह गया है क्षेत्र या एक यौगिक बयान
  • कई नए डेटा प्रकार के शुरू होने से फाइल करने के लिए प्रतिबंधित, लंबे समय तक int, वैकल्पिक विस्तारित पूर्णांक प्रकार, एक स्पष्ट बूलियन डेटा प्रकार, और जटिल संख्याओं का प्रतिनिधित्व करने के लिए एक जटिल प्रकार
  • चर लंबाई सरणियों
  • एक लाइन के लिए
  • समर्थन या BCPL में के रूप में // के साथ शुरुआत टिप्पणी, इस तरह के snprintf के रूप में सी ++
  • नए पुस्तकालय काम करता है, इस तरह के stdbool.h और inttypes रूप
  • नया शीर्षक फ़ाइलें, .h
  • टाइप-जेनेरिक गणित फ़ंक्शन (tgmath।ज)
  • आईईईई फ्लोटिंग बिंदु के लिए बेहतर समर्थन
  • नामित initializers
  • यौगिक शाब्दिक
  • variadic मैक्रो (चर arity का मैक्रो) के लिए
  • समर्थन
  • अधिक आक्रामक कोड अनुकूलन अनुमति देने के लिए योग्यता को प्रतिबंधित

http://en.wikipedia.org/wiki/C99

A Tour of C99

-2

बस सी ++ मोड में संकलित करें। आपको C++ का उपयोग करने के लिए कक्षाओं का उपयोग करने की आवश्यकता नहीं है। मैं मूल रूप से सी ++ को "निसर सी" के रूप में उपयोग करता हूं :)

मैं कक्षाओं का कभी भी उपयोग नहीं करता हूं और कभी भी विधि का उपयोग नहीं करता हूं।

+5

कोई सी 99 "निसर सी" है, यदि आप सी वास्तव में लिखने जा रहे हैं (सी 99 में बहुत अच्छा गैर-ओओपी/ओवरलोडिंग है संबंधित सी ++ फीचर्स, और अधिक, और इसमें सी ++ का उपयोग करने से कम "गॉथचास" है) – Spudd86

+0

लेकिन आप सी में 'कोशिश/पकड़' नहीं कर सकते हैं जो सी ++ में एक प्लस है जिसे सी ने कभी नहीं अपनाया है, वहां एक एक्सटेंशन है जिसे ई 4 सी कहा जाता है (Exceptions4c) https://code.google.com/p/exceptions4c/ पैकेज को पूरा करने के लिए लगता है। कोड लिख नहीं सकता है जो कहीं भी दुर्घटनाग्रस्त नहीं होगा अगर यह बड़ी विधि है इसलिए यही कारण है कि 'कोशिश/पकड़' महत्वपूर्ण हैं, लेकिन हाँ जल्दी या बाद में जब कोड क्रैश हो जाता है तो आप 'कोशिश/पकड़' को हटा सकते हैं। – user3435580

+0

समस्या यह है कि सी ++ सी का सुपरसेट नहीं है, इसलिए यह काफी संभावना है कि एक पूरी तरह से वैध सी प्रोग्राम सी ++ के रूप में संकलित नहीं होगा। – skyking

4

आप सी परिवर्तन में संकलन करता है, तो

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 

REF: http://cplusplus.syntaxerrors.info/index.php?title= 'for'_loop_initial_declaration_used_outside_C99_mode

0

क्यूटी-निर्माता के लिए: बस अगले लाइनों * .pro फ़ाइल में जोड़ने के लिए ...

QMAKE_CFLAGS_DEBUG = \ 
    -std=gnu99 

QMAKE_CFLAGS_RELEASE = \ 
    -std=gnu99 
0

मैं एक ही समस्या थी और यह काम करता तुम सिर्फ पाश की i बाहर घोषित करने के लिए है:

int i; 

for(i = low; i <= high; ++i) 

{ 
     res = runalg(i); 
     if (res > highestres) 
     { 
       highestres = res; 
     } 

} 
14

codeblocks में C99 मोड में स्विच करने के लिए, अगले चरणों का पालन:

क्लिक करें परियोजना/बिल्ड विकल्पों, तो टैब में संकलक सेटिंग उपटैब अन्य विकल्प चुनें, और में -std=c99 जगह टेक्स्ट क्षेत्र, और ठीक पर क्लिक करें।

यह आपके कंपाइलर के लिए सी 99 मोड चालू करेगा।

मुझे उम्मीद है कि यह किसी की मदद करेगा!

+0

यह _Bther कंपाइलर विकल्प_ के तहत कोडब्लॉक्स 16.1 में मदद मिली! हालांकि मैंने उपरोक्त कुछ उत्तरों में चित्रित '-std = gnu99' का उपयोग किया था! –

+0

लेकिन इससे अस्थायी रूप से मदद मिली! मुझे हर बार कोड संकलित करने के लिए यह करना है! ... :( –

+0

नहीं, आपने नहीं किया है! यह केवल एक बार प्रत्येक नई परियोजना के लिए किया जाना चाहिए। – akelec