2008-08-24 18 views
102

Ich versuche the 3n+1 problem zu lösen und ich habe eine for Schleife, die wie folgt aussieht:Wie behebe ich "for loop initial declaration used außerhalb C99 modus" GCC error?

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

I:

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

     } 

Leider mit GCC zu kompilieren Ich erhalte diese Störung, wenn ich versuche, Ich weiß nicht, was der C99-Modus ist. Irgendwelche Ideen?

Antwort

125

Ich würde versuchen, i außerhalb der Schleife zu erklären!

Viel Glück auf 3n + 1 :-)

Hier Lösung ist ein Beispiel:

#include <stdio.h> 

int main() { 

    int i; 

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

    return 0; 
} 

Lesen Sie mehr über for-Schleifen in C here.

+0

Warum verwenden Sie dann nicht die While-Schleife? –

102

Es gibt einen Compiler-Schalter, die C99 mode ermöglicht, die unter anderer Deklaration einer Variablen innerhalb der for-Schleife ermöglicht. Um es einzuschalten, verwenden Sie den Compiler-Schalter -std=c99

Oder wie @OysterD sagt, deklarieren Sie die Variable außerhalb der Schleife.

+7

eigentlich -std = gnu99 ist wahrscheinlich wünschenswerter, da du auf diese Weise immer noch gcc-Erweiterungen bekommst (gcc ist standardmäßig -std = gnu89, wird aber in den nächsten Versionen zu gnu99 wechseln) – Spudd86

+3

@ Spudd86: Ob du * Wollen * GCC-Erweiterungen aktivieren, hängt davon ab, was Sie tun. Sie zu deaktivieren ist hilfreich, wenn Sie Code schreiben möchten, der auf andere Compiler als gcc portierbar ist. –

14

Ich habe diesen Fehler auch bekommen.

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

ist nicht gültig in der C89/C90-Norm. Wie OysterD sagt, was Sie tun müssen:

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

Ihr ursprünglicher Code in C99 und später Standards der C-Sprache erlaubt.

+3

Für gcc, werfen Sie ein "-std = c99". Weitere Funktionen finden Sie unter Imrans Antwort. –

+0

Ja, es ist gültig C; es ist einfach nicht gültig C89/C90. –

+0

@KeithThompson: geklärt. – Blorgbeard

13

@Blorgbeard:

Neue Funktionen in C99

  • Inline-Funktionen
  • Variablendeklaration nicht mehr nur Umfang oder den Beginn einer zusammengesetzten Anweisung
  • mehrere neue Datentypen Datei, Einschließlich long long int, optionale erweiterte Integer-Typen, ein expliziter boolescher Datentyp und ein komplexer Typ zur Darstellung komplexer Zahlen
  • Arrays variabler Länge
  • Unterstützung für einzeilige Kommentare von // beginnen, wie in BCPL oder C++
  • neue Bibliotheksfunktionen, wie snprintf
  • neue Header-Dateien, wie stdbool.h und inttypes .h
  • Typ-generische mathematische Funktionen (tgmath.h)
  • verbesserte Unterstützung für IEEE-Gleitkomma
  • bezeichnet Initialisierungen
  • Verbindung Literale
  • Unterstützung für variadische Makros (Makros variabler arity)
  • Qualifizierungs beschränken aggressivere Code-Optimierung zu ermöglichen

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

A Tour of C99

-2

Kompilieren Sie einfach im C++ Modus. Sie müssen keine Klassen verwenden, um C++ zu verwenden. Ich verwende im Grunde C++ als ein "netteres C" :)

Ich benutze fast nie Klassen und benutze nie Methodenüberbrückung.

+5

nein c99 ist "netter C", wenn du C wirklich schreiben willst (C99 enthält ziemlich all das nette Nicht-OOP/Überladen verwandte C++ - Funktionen und mehr, und es hat weniger "gotchas" als mit C++ tut) – Spudd86

+0

Aber Sie können nicht versuchen/catch's' in C, die ein Plus in C++ ist, die C nie angenommen ja gibt es eine Erweiterung namens E4C (Exceptions4c) https://code.google.com/p/exceptions4c/ Scheint, das Paket abzuschließen. Ich kann keinen Code schreiben, der nicht irgendwo abstürzt, wenn es eine riesige Methode ist. Deshalb sind "try/catch's" wichtig, aber früher oder später, wenn der Code nicht mehr abstürzt, könntest du die "try/catch's" entfernen. – user3435580

+0

Das Problem ist, dass C++ keine Obermenge von C ist, daher ist es sehr wahrscheinlich, dass ein perfekt gültiges C-Programm nicht als C++ kompiliert wird. – skyking

4

, wenn Sie kompilieren in C Änderung

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

zu

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

Sie können auch mit dem C99 Schaltersatz kompilieren. Setzen Sie -std = c99 in der Kompilation Zeile:

gcc -std=c99 foo.c -o foo 

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

0

Für Qt-Creator: fügen Sie einfach folgende Zeilen zu * .proDatei ...

QMAKE_CFLAGS_DEBUG = \ 
    -std=gnu99 

QMAKE_CFLAGS_RELEASE = \ 
    -std=gnu99 
0

hatte ich das gleiche Problem und es funktioniert Sie müssen nur die i außerhalb der Schleife deklarieren:

int i; 

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

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

} 
14

Zum Umschalten auf C99 Modus in Codeblocks, die nächsten Schritte folgen:

Klicken Sie Projekt/Build-Optionen, dann in Tab Compiler-Einstellungen Subreiter Andere Optionen und legen -std=c99 in der Auswahl Textbereich, und klicken Sie auf Ok.

Dies wird C99 Modus für Ihren Compiler einschalten.

Ich hoffe, das wird jemandem helfen!

+0

Dies half in Codeblocks 16.1 unter den _Other Compiler Optionen_! Obwohl ich '-std = gnu99' verwendet habe, wie in einigen Antworten oben gezeigt! –

+0

Aber das half vorübergehend! Ich muss das jedes Mal machen, wenn ich Code kompiliere! ... :( –

+0

Nein, hast du nicht! Das muss für jedes neue Projekt nur einmal gemacht werden. – akelec