2008-08-24 21 views
102

estoy tratando de resolver the 3n+1 problem y tengo un bucle for que tiene este aspecto:¿Cómo soluciono "la declaración inicial del ciclo utilizada fuera del modo C99" Error GCC?

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

     } 

Desafortunadamente Estoy consiguiendo este error cuando intento compilar con GCC:

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

I no sé qué es el modo C99. ¿Algunas ideas?

Respuesta

125

¡Intentaría declarar i fuera del circuito!

Buena suerte en la solución de 3n + 1 :-)

He aquí un ejemplo:

#include <stdio.h> 

int main() { 

    int i; 

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

    return 0; 
} 

Leer más en los bucles en C here.

+0

¿por qué no usa while loop en su lugar? –

102

Hay un interruptor de compilación que habilita C99 mode, que permite, entre otras cosas, la declaración de una variable dentro del bucle for. Para activarlo utilice el compilador -std=c99

O como @OysterD dice, declare la variable fuera del ciclo.

+7

en realidad -std = gnu99 es probablemente más deseable, ya que de esa manera todavía obtienes extensiones de gcc (gcc por defecto es -std = gnu89, sin embargo esto cambiará a gnu99 en algún momento en las siguientes versiones) – Spudd86

+3

@ Spudd86: Si * querer * habilitar las extensiones de gcc depende de lo que esté haciendo. Deshabilitarlos es útil si su objetivo es escribir código que sea portátil para compiladores que no sean gcc. –

14

He recibido este error también.

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

no es válido en el estándar C89/C90. Como dice OysterD, que tiene que hacer:

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

Su código original está permitido en C99 y normas posteriores del lenguaje C.

+3

Para gcc, arroje un "-std = c99". Para características adicionales, vea la respuesta de Imran. –

+0

Sí, es válido C; simplemente no es válido C89/C90. –

+0

@KeithThompson: aclarado. – Blorgbeard

13

@Blorgbeard:

Nuevas características de C99

  • funciones en línea
  • declaración de variables ya no se limitan a presentar alcance o el inicio de una instrucción compuesta
  • varios nuevos tipos de datos, incluidos long long int, tipos de entero extendidos opcionales, un tipo de datos booleano explícito y un tipo complejo para representar números complejos
  • matrices de longitud variable
  • soporte para en línea Comentarios comienzan con //, como en BCPL o C++
  • nuevas funciones de la biblioteca, como snprintf
  • nuevos archivos de cabecera, tales como stdbool.h y inttypes .h
  • funciones genéricas de tipo genérico (tgmath.h)
  • soporte mejorado para punto flotante IEEE
  • inicializadores designados
  • literales compuestos
  • soporte para macros variadic (macros de aridad variables)
  • restringir cualificación para permitir la optimización del código más agresivo

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

A Tour of C99

-2

Simplemente compila en modo C++. No NECESITA usar clases para usar C++. Básicamente utilizo C++ como una "C más agradable" :)

Casi nunca utilizo clases y nunca uso el método de exclusión.

+5

no c99 es "C más agradable", si va a escribir C realmente lo hace (C99 contiene casi todo el buen no OOP/sobrecarga características C++ relacionadas, y más, y tiene menos "errores" que usar C++) – Spudd86

+0

Pero no se puede hacer 'try/catch's' en C, que es uno más en C++ que C nunca adoptó, sí, hay una extensión llamada E4C (Excepciones4c) https://code.google.com/p/exceptions4c/ Parece que completa el paquete. No se puede escribir el código que no se bloqueará en algún lugar si es un método enorme, por eso 'try/catch's' es importante, pero sí, tarde o temprano, cuando el código deje de bloquearse, se puede eliminar el' try/catch's'. – user3435580

+0

El problema es que C++ no es un superconjunto de C, por lo tanto, es bastante probable que un programa C perfectamente válido no se compile como C++. – skyking

4

si se compila en el cambio C

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

a

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

También puede compilar con el modificador C99. Ponga -std = c99 en la línea de compilación:

gcc -std=c99 foo.c -o foo 

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

0

para Qt-creador: sólo tiene que añadir siguientes líneas al archivo * .pro ...

QMAKE_CFLAGS_DEBUG = \ 
    -std=gnu99 

QMAKE_CFLAGS_RELEASE = \ 
    -std=gnu99 
0

que tenían el mismo problema y funciona sólo hay que declarar la i fuera del bucle:

int i; 

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

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

} 
14

Para cambiar a modo de C99 en CodeBlocks, siga los siguientes pasos:

Haga clic Proyecto/Opciones de construcción, a continuación, en la pestaña configuración del compilador eligen subficha Otras opciones, y colocan -std=c99 en el área de texto y haga clic en Ok.

Esto activará el modo C99 para su compilador.

¡Espero que esto ayude a alguien!

+0

Esto ayudó en los bloqueos de código 16.1 bajo _Otras opciones de compilador_! ¡Aunque utilicé '-std = gnu99' como se describe en algunas de las respuestas anteriores! –

+0

¡Pero esto ayudó temporalmente! ¡Tengo que hacer esto cada vez que compilo código! ... :( –

+0

No, no lo has hecho. Esto debe hacerse para cada nuevo proyecto solo una vez. – akelec

Cuestiones relacionadas