Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: AlexFifa en 11 Enero 2013, 00:06 am



Título: No puedo compilar un programa en C Ayuda!
Publicado por: AlexFifa en 11 Enero 2013, 00:06 am
Pues yo casi siempre he programado en C++ y usaba C para cosas sencillas pero ahora me tope con un error inesperado que sinceramente no entiendo porque, ese mismo codigo lo he compilado como C++ y me funciona de maravilla

Yo uso el Visual Studio 2012 uso codigo nativo, ya aprendi a compilar en modo de consola.

Código
  1. #include <stdio.h>
  2.  
  3. int main(void) {
  4. printf("\nHola Mundo!\n\n");
  5. int a;
  6.  
  7. return 0;
  8. }
  9.  

Me he fijado que siempre que declaro una variable despues de una llamada a función me lanza ese error:
Código
  1. Compilador de optimización de C/C++ de Microsoft (R) version 17.00.50727.1 para x64
  2. (C) Microsoft Corporation. Reservados todos los derechos.
  3.  
  4. simple.c
  5. simple.c(5) : error C2143: error de sintaxis : falta ';' delante de 'tipo'

Talvez me hace falta escribir algo pero ya repase incontables veces el codigo y a mi parecer esta bien hecho.

Les agradecería mucho si me ayudaran porque no entiendo que es lo que esta pasando



Título: Re: No puedo compilar un programa en C Ayuda!
Publicado por: zonahurbana en 11 Enero 2013, 03:39 am
En C, a diferencia de C++, las variables deben inicializarse justo al comienzo de cada ámbito.
Es decir, cada vez que veas que se abren llaves, lo primero que verás, o que deberías ver (en C) es la declaración y definición de variables.

C aún mantiene ciertas diferencias con C++, otra de ellas es que sea necesario escribir void como argumento de la función main().
En C++ eso significa "sin argumentos", mientras que en C precisa "una cantidad indefinida de argumentos, de tipos desconocidos".


Título: Re: No puedo compilar un programa en C Ayuda!
Publicado por: AlexFifa en 11 Enero 2013, 04:54 am
Muchas Gracias!
Sinceramente no me acordaba de esa regla en C
Con razón cuando veía código cualquiera escrito en C al inicio siempre se declaran variables!
Nuevamente Gracias!!  ;D


Título: Re: No puedo compilar un programa en C Ayuda!
Publicado por: durasno en 11 Enero 2013, 07:08 am
Citar
las variables deben inicializarse justo al comienzo de cada ámbito
No, las variables se pueden declarar en cualquier lado. Incluso se puede hacer algo como:
Código
  1. scanf("%d",&tam);
  2. int arr[tam]; /* fijate que se puede declarar un arreglo en tiempo de ejecucion despues de pedir el tamaño */

Para mi tu problema se debe a una configuracion del IDE que usas(como no lo uso no tengo idea)


Saludos


Título: Re: No puedo compilar un programa en C Ayuda!
Publicado por: zonahurbana en 11 Enero 2013, 13:48 pm
¿Y eso que usted menciona sigue las normas del C estándar?
¿Cómo podría estar seguro de que algo sigue las normas de lo estándar?

Pregunto esto porque en otro foro yo comentaba que sí era posible leer una variable y luego usarla como tamaño de un arreglo, que el IDE no me mostraba problemas. Luego me decían que debía ser problema del IDE, que compilándolo directamente (a través de comandos) se mostraba un error diciendo que iba en contra de lo estándar.

Porfavor fíjese en la página 87 de este PDF:
Citar
http://arco.esi.uclm.es/~david.villa/pensar_en_C++/pensar_en_cpp-vol1.pdf
Justamente en la parte que dice "Declaración de variables al vuelo".

Me dijeron que era una referencia muy buena.

Saludos.


Título: Re: No puedo compilar un programa en C Ayuda!
Publicado por: durasno en 11 Enero 2013, 19:44 pm
Lei el pdf y dice lo que mensionaste antes; yo tenia entendido que segun el C99 era posible hacer lo que dije abajo
http://en.wikipedia.org/wiki/C99

Saludos

PD: espero q alguien con mas experiencia aclare esto


Título: Re: No puedo compilar un programa en C Ayuda!
Publicado por: kaiserr en 12 Enero 2013, 02:29 am
No, las variables se pueden declarar en cualquier lado. Incluso se puede hacer algo como:
Código
  1. scanf("%d",&tam);
  2. int arr[tam]; /* fijate que se puede declarar un arreglo en tiempo de ejecucion despues de pedir el tamaño */

En lenguaje C por lo que tengo entendido, no se puede hacer eso. Las arrays has de declararlas con un valor constante.

Para utilizar espacios dinamicos se ha de utilizar, si recuerdo bien, la funcion malloc()
y free() (esta ultima para liberar espacio), que estan dentro de la libreria <stdlib.h>


Volviendo al tema principal:
Pues yo casi siempre he programado en C++ y usaba C para cosas sencillas pero ahora me tope con un error inesperado que sinceramente no entiendo porque, ese mismo codigo lo he compilado como C++ y me funciona de maravilla

Yo uso el Visual Studio 2012 uso codigo nativo, ya aprendi a compilar en modo de consola.

Código
  1. #include <stdio.h>
  2.  
  3. int main(void) {
  4. printf("\nHola Mundo!\n\n");
  5. int a;
  6.  
  7. return 0;
  8. }
  9.  

Me he fijado que siempre que declaro una variable despues de una llamada a función me lanza ese error:
Código
  1. Compilador de optimización de C/C++ de Microsoft (R) version 17.00.50727.1 para x64
  2. (C) Microsoft Corporation. Reservados todos los derechos.
  3.  
  4. simple.c
  5. simple.c(5) : error C2143: error de sintaxis : falta ';' delante de 'tipo'

Talvez me hace falta escribir algo pero ya repase incontables veces el codigo y a mi parecer esta bien hecho.

Les agradecería mucho si me ayudaran porque no entiendo que es lo que esta pasando



Lo he probado en visual studio 2010 y tampoco me deja. Asi que debe de ser que solo se puede declarar al principio, de todas formas asi es como me enseñaron.


Título: Re: No puedo compilar un programa en C Ayuda!
Publicado por: durasno en 12 Enero 2013, 22:15 pm
Citar
En lenguaje C por lo que tengo entendido, no se puede hacer eso

Lee el link q deje y vas a ver que se puede. Incluso hay un ejemplo de variable-length arrays


Saludos


Título: Re: No puedo compilar un programa en C Ayuda!
Publicado por: kaiserr en 12 Enero 2013, 22:40 pm
Nose, de wikipedia no me fio la verdad. Antes de comentar tambien busque informacion y segun lo que lei no se podia... y lo probe y no me compilaba.

Ademas lo que dice wikipedia:
Citar
C (added in C99 and subsequently in C11 relegated to a conditional feature which implementations aren't required to support;[1] on some platforms, could be implemented previously with alloca() or similar functions)
mi ingles sera de lo peor que hay en el foro, pero entiendo que hay plataformas que no lo aceptan y que es mejor la funcion que puse antes.

Pero tampoco soy experto en C... asi que, tampoco puedo negarlo.

EDITO:
http://www.lcc.uma.es/~pscp/doc/cavanzado.pdf


Título: Re: No puedo compilar un programa en C Ayuda!
Publicado por: durasno en 13 Enero 2013, 00:34 am
Es verdad q wiki no es muy confiable, pero como en todos lados dice lo mismo me parecio indiferente subir ese link

Me olvide de comentar lo del C11, como aun no uso ninguna de las caracteristicas que se añadio no le di importancia(incluso mi compilador no lo tengo actualizado, asi q no soporta ese estandar)... Igual la idea era mostrar que se podia, al menos con mi editor de texto y el gcc puedo :)


Saludos

PD:
Citar
http://www.lcc.uma.es/~pscp/doc/cavanzado.pdf
tenia que leer alguna pagina en particular?? porque no encontre nada respecto al tema(o sera el sueño que tengo :S)


Título: Re: No puedo compilar un programa en C Ayuda!
Publicado por: kaiserr en 13 Enero 2013, 01:12 am
pues si se puede... chapo jaja :-X

pagina 6 y el ejemplo pagina 7


Título: Re: No puedo compilar un programa en C Ayuda!
Publicado por: rir3760 en 13 Enero 2013, 02:13 am
Depende del estándar bajo el cual se compile el programa.

* En C90 deben colocarse primero las sentencias declarativas (declaraciones) y solo después las ejecutivas (sentencias). Y cuando se declara un array debe indicarse su numero de elementos mediante una expresión entera mayor que cero y calculable en tiempo de compilación (constante). Compilando en este modo se genera el mensaje de error mencionado, este se describe en MSDN en la pagina Compiler Error C2143 (http://msdn.microsoft.com/en-us/library/0afb82ta%28v=vs.100%29.aspx).

* En C99 se puede al igual que C++ intercalar sentencias de ambos tipos y también puede indicarse el numero de elementos de un array mediante una expresión que no sea constante, a estas se les llama "arrays de longitud variable" o en ingles VLAs (variable length arrays).

Por ultimo para conocer a detalle el lenguaje C la referencia mas completa y correcta son sus estándares C90, C99 y C11. Se pueden comprar en la pagina de la ISO o se puede optar por la opción mas cercana y gratuita que son los borradores (buscar en Google N1256 y N1570).

Pero hay que aclarar que no son documentos para principiantes, para estos mejor un buen libro.

Un saludo