[C con Clase] problema al Crear un vector de enteros

Programante programante en gmail.com
Dom Oct 11 23:49:47 CEST 2009


bien1 escribió:
> hola.
>
> teniendo este codigo en un fichero llamado main.c;
>
> fichero main.c
>
> #include <stdio.h>
> #include <string.h>
>
>
> int main()
> {
> 	int n;
> 	int i;
> 	char cadena[] = "texto";
> 	n = strlen(cadena);
>
> 	int numero[n];
>
> 	for(i=0; i<n; i++)
> 	{
> 	    numero[i] = i;
> 	    printf("\nel numero %i \tvale \t%i", i, numero[i]);
> 	}
>
> 	printf("\nEl numero de elementos es %i", n);
>
> 	getchar();
> }
>
> Lo compilo en Mingw sin problema, pero en visual c++ 2008, me tira estos errores:
> Error	1	error C2143: error de sintaxis : falta ';' delante de 'tipo'	d:\pendientes\aprender lenguaje c++\visual c++ 2008\11\1.c	12	11
> Error	2	error C2065: 'numero' : identificador no declarado	d:\pendientes\aprender lenguaje c++\visual c++ 2008\11\1.c	16	11
> Error	3	error C2109: el subíndice requiere una matriz o tipo de puntero	d:\pendientes\aprender lenguaje c++\visual c++ 2008\11\1.c	16	11
> Error	4	error C2065: 'numero' : identificador no declarado	d:\pendientes\aprender lenguaje c++\visual c++ 2008\11\1.c	17	11
> Error	5	error C2109: el subíndice requiere una matriz o tipo de puntero	d:\pendientes\aprender lenguaje c++\visual c++ 2008\11\1.c	17	11
>
> quiero crear el vector de enteros al comnocer el numero de elementos de la cadena de caracteres, mediante strlen.
>
> salud-
> gracias

El primer error te lo da porque en Visual C++ al compilar código en C
tienes que poner todas las declaraciones de variables al principio,
antes de las sentencias.
Este es el comportamiento tradicional de C, aunque gcc (mingw) por
defecto use un dialecto donde se puede usar, también se permite en C99.

Si mueves int numero[n]; hacia arriba antes del strlen() te darás cuenta
de que no puedes inicializarlo con el valor del strlen, que ya te han
comentado otros en la lista.
gcc permite esa sintaxis, realizando automáticamente un puntero e
inicializándolo con alloca(). Visual C++ no lo permite (y creo que el
estándar tampoco).

En este caso, lo que puedes hacer es sustituir

> n = strlen(cadena);
> int numero[n];
por 
int numero[sizeof(cadena)-1];

sizeof es una construcción del lenguaje, por lo que sizeof(cadena)-1 es constante y puedes usarlo para inicializarlo (del mismo modo que podrías poner un 5 a mano contando las letras de la palabra texto).









Más información sobre la lista de distribución Cconclase