Come posso correggere l'errore GCC "dichiarazione iniziale del ciclo for utilizzata al di fuori della modalità C99"?
Domanda
Sto cercando di risolvere il problema 3n+1 e ho un for
ciclo che assomiglia a questo:
for(int i = low; i <= high; ++i)
{
res = runalg(i);
if (res > highestres)
{
highestres = res;
}
}
Sfortunatamente ricevo questo errore quando provo a compilare con GCC:
3np1.c:15:errore:Dichiarazione iniziale "per" Utilizzato al di fuori della modalità C99
Non so cosa sia la modalità C99.Qualche idea?
Soluzione
Proverei a dichiarare i
fuori dal giro!
Buona fortuna per risolvere 3n+1 :-)
Ecco un esempio:
#include <stdio.h>
int main() {
int i;
/* for loop execution */
for (i = 10; i < 20; i++) {
printf("i: %d\n", i);
}
return 0;
}
Per saperne di più sui cicli for in C Qui.
Altri suggerimenti
C'è un'opzione del compilatore che abilita Modalità C99, che tra le altre cose consente la dichiarazione di una variabile all'interno del ciclo for.Per attivarlo utilizzare l'opzione del compilatore -std=c99
O come dice @OysterD, dichiara la variabile all'esterno del ciclo.
Per passare a C99 modalità in CodeBlocks, seguire i passaggi successivi:
Clic Opzioni di progetto/costruzione, poi nella tab Impostazioni del compilatore scegli la sottoscheda Altre opzioni, e luogo -std=c99
nell'area di testo e fare clic OK.
Questo cambierà C99 modalità attiva per il tuo compilatore.
Spero che questo possa aiutare qualcuno!
Anch'io ho ricevuto 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 negli standard C99 e successivi del linguaggio C.
Nuove funzionalità in C99
- funzioni in linea
- la dichiarazione di variabile non è più limitata all'ambito del file o all'inizio di un'istruzione composta
- diversi nuovi tipi di dati, inclusi long long int, tipi interi estesi opzionali, un tipo di dati booleano esplicito e un tipo complesso per rappresentare numeri complessi
- array di lunghezza variabile
- supporto per commenti di 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 generiche (tgmath.h)
- supporto migliorato per la virgola mobile IEEE
- inizializzatori designati
- letterali composti
- supporto per macro variadic (macro di arità variabile)
- limitare la qualificazione per consentire un'ottimizzazione del codice più aggressiva
se compili in C cambia
for (int i=0;i<10;i++) { ..
A
int i;
for (i=0;i<10;i++) { ..
È inoltre possibile compilare con il set di opzioni C99.Inserisci -std=c99 nella riga di compilazione:
gcc -std=c99 foo.c -o foo
RIF: http://cplusplus.syntaxerrors.info/index.php?title='for'_loop_initial_declaration_used_outside_C99_mode
Ho avuto lo stesso problema e funziona, devi solo dichiarare il file i
fuori dal giro:
int i;
for(i = low; i <= high; ++i)
{
res = runalg(i);
if (res > highestres)
{
highestres = res;
}
}
Per chiunque tenti di compilare codice da una fonte esterna che utilizza un'utilità di compilazione automatizzata come Fare, per evitare di dover rintracciare le chiamate esplicite di compilazione di gcc è possibile impostare una variabile d'ambiente.Inserisci al prompt dei comandi o inserisci .bashrc (o .bash_profile su Mac):
export CFLAGS="-std=c99"
Tieni presente che una soluzione simile si applica se ti imbatti in uno scenario simile con la compilazione C++ che richiede C++ 11, puoi utilizzare:
export CXXFLAGS="-std=c++11"
Per Qt Creator:basta aggiungere le righe successive al file *.pro...
QMAKE_CFLAGS_DEBUG = \
-std=gnu99
QMAKE_CFLAGS_RELEASE = \
-std=gnu99
Jihene Stambouli ha risposto alla domanda OP in modo più diretto...La domanda era;perché lo fa
for(int i = low; i <= high; ++i)
{
res = runalg(i);
if (res > highestres)
{
highestres = res;
}
}
produrre l'errore;
3np1.c:15: error: 'for' loop initial declaration used outside C99 mode
per cui la risposta è
for(int i = low...
dovrebbe essere
int i;
for (i=low...