C/Visual C - Redimensionamiento de arreglos

 
Vista:

Redimensionamiento de arreglos

Publicado por Ernesto (2 intervenciones) el 20/09/2009 21:33:31
Saludos tengo un problema, y es que mi compilador de C no puede hacer asignaciones de arreglos con variables(arreglo[var]), alguien podria decirme alguna tecnica similar?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Redimensionamiento de arreglos

Publicado por Paco (7 intervenciones) el 21/09/2009 17:12:10
Parece que lo que quieres es dimensionar un array (lo siento, no me gusta la palabra arreglo) a un tamaño que se calcula en alguna parte de tu programa.

En efecto, un compilador C no puede hacer lo que dices (que yo sepa, en nungún lenguaje compilado puedes), por lo que, en principio, los arrays los tienes que dimensionar en tiempo de compilación (indicando la dimensión en la declaración, por ejemplo, int x[10] declararía un array x de 10 números enteros.

Afortunadamente, C permite hacer una pequeña 'trampa' para lo que quieres: Utilizar punteros. Se ha`'ia de la siguiente forma:

int *x; // Declaramos un puntero a número entero

// Ahora necesito un array de n números enteros
// El valor de n lo he calculado en alguna parte de mi programa
x = (int *)malloc(n*sizeof(int));

La función malloc reserva el número de bytes indicado (en este caso, como necesito n enteros, necesitaré multiplicar n por el tamaño de un entero, para lo cual utilizo el operador sizeof). Como esta función devuelve un puntero a tipo void, es necesario hacer un typecast.
Ojo, que el contenido del espacio así reservado está indeterminado, no des por sentado que se inicia a cero.

Otra forma de hacerlo sería:

x = (int *)calloc(n, sizeof(int));

Básicamente, hace lo mismo que malloc, pero en este caso se ha reservado directamente espacio para n números enteros y se han inicializado a cero. El typecast sigue siendo necesario.

Ten en cuenta que, estrictamente, x NO es un array. C tiene la ventaja (o el inconveniente para algunos) de que, una vez que se ha asignado un área de memoria a un puntero, éste puede utilizarse como si fuese un array.

Cuando dejes de necesitar la memoria así reservada, debes liberarla:

free(x);

libera la memoria asignada al puntero x (da igual que se la hayas asignado con malloc o con calloc).

Ten siempre presente la liberación de la memoria asignada, i te descuidas te puedes encontrar con que tu programa va agotando poco a poco la memoria disponible.

En cualquier caso, es conveniente que te busques una buena bibliografía y que entiendas bien el concepto de punteros.

Espero que todo este rollo te haya servido de ayuda. Saludos,

PACO.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Redimensionamiento de arreglos

Publicado por Ernesto (2 intervenciones) el 21/09/2009 17:18:49
Hola Paco, Gracias por responder de todas formas lo habia resuelto. utilize las funciones malloc,free, funcionaron barbaro. Tmb intente una mas eficiente pero solo para c++, que es utilizar el operando new para asignarle el tamaño de una memoria a partir de una variable o sea:

int *array,a;

scanf("tamaño(implicito) %d",&a);
array=new int(n)

Saludos =)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar