Come posso correggere “per la dichiarazione iniziale del ciclo utilizzata al di fuori della modalità C99” Errore GCC?

Sto cercando di risolvere il problema 3n + 1 e ho un ciclo for che assomiglia a questo:

 for(int i = low; i  highestres) { highestres = res; } } 

Sfortunatamente sto ricevendo questo errore quando provo a compilare con GCC:

3np1.c: 15: errore: ‘per’ la dichiarazione iniziale del ciclo utilizzata al di fuori della modalità C99

Non so quale sia la modalità C99. Qualche idea?

Cercherò di dichiarare che fuori dal giro!

Buona fortuna a risolvere 3n + 1 🙂

Ecco un esempio:

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

Leggi di più su loop in C qui .

C’è un interruttore del compilatore che abilita la modalità C99 , che tra le altre cose consente la dichiarazione di una variabile all’interno del ciclo for. Per -std=c99 usa l’ -std=c99 del compilatore -std=c99

O come dice @OysterD, dichiara la variabile al di fuori del ciclo.

Per passare alla modalità C99 in CodeBlocks , segui i passaggi seguenti:

Fare clic su Progetto / Costruisci opzioni , quindi nella scheda Impostazioni del compilatore scegliere sottoscheda Altre opzioni , quindi inserire -std=c99 nell’area di testo e fare clic su OK .

Questo accenderà la modalità C99 per il tuo compilatore.

Spero che questo aiuti qualcuno!

Ho ricevuto anche questo errore.

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

non è valido nello standard C89 / C90. Come dice OysterD, devi fare:

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

Il tuo codice originale è consentito in C99 e successivi standard del linguaggio C.

@Blorgbeard :

Nuove funzionalità in C99

  • funzioni inline
  • la dichiarazione delle variabili non è più limitata all’ambito del file o all’inizio di un’istruzione composta
  • diversi nuovi tipi di dati, compresi lunghi long int, tipi interi estesi opzionali, un tipo di dati booleani espliciti e un tipo complesso per rappresentare numeri complessi
  • matrici di lunghezza variabile
  • supporto per i commenti su una riga che iniziano con //, come in BCPL o C ++
  • nuove funzioni di libreria, come snprintf
  • nuovi file di intestazione, come stdbool.h e inttypes.h
  • funzioni matematiche di tipo generico (tgmath.h)
  • supporto migliorato per il punto mobile IEEE
  • inizializzatori designati
  • letterali composti
  • supporto per macro variadic (macro di arity variabile)
  • limitare la qualifica per consentire l’ottimizzazione del codice più aggressiva

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

Un giro di C99

se compili in C cambia

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

a

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

Puoi anche compilare con il set di interruttori C99. Metti -std = c99 nella riga della compilation:

 gcc -std=c99 foo.c -o foo 

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

Per Qt-creatore: basta aggiungere le righe successive al file * .pro …

 QMAKE_CFLAGS_DEBUG = \ -std=gnu99 QMAKE_CFLAGS_RELEASE = \ -std=gnu99 

Ho avuto lo stesso problema e funziona, devi solo dichiarare l’ i al di fuori del ciclo:

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

Per chiunque tenti di compilare codice da un’origine esterna che utilizza un’utilità di compilazione automatica come Make , per evitare di dover rintracciare le chiamate di compilazione gcc esplicite è ansible impostare una variabile di ambiente. Immettere il prompt dei comandi o inserire .bashrc (o .bash_profile su Mac):

 export CFLAGS="-std=c99" 

Si noti che una soluzione simile si applica se si esegue uno scenario simile con la compilazione C ++ che richiede C ++ 11, è ansible utilizzare:

 export CXXFLAGS="-std=c++11" 

Basta compilare in modalità C ++. Non è NECESSARIO usare le classi per usare C ++. Fondamentalmente uso C ++ come “C più bella” 🙂

Non uso quasi mai le classi e non uso mai il metodo overiding.