Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: J_F_NASH en 04 de Febrero de 2008, 08:37:22 AM

Título: Declarar un arreglo bidimensional de tamaño variable en C.
Publicado por: J_F_NASH en 04 de Febrero de 2008, 08:37:22 AM

int ancho = 10;
int alto = 10;
int arreglo[ancho][alto]

Veo que esto no es posible, ancho y alto deben ser constantes. Si no me equivoco tengo dos opciones para resolver esto:
-Listas enlazadas: Me ha parecido demasiado complicado para meterme en tal berengenal.
-Memoria Dinámica. Utilizando malloc/free: Parece mas fácil pero ¿cómo puedo aplicarlo a un arreglo bidimensional?

¿Hay otra alternativas? ¿cual es la forma mas simple de hacer esto?

S2.
Título: Re: Declarar un arreglo bidimensional de tamaño variable en
Publicado por: Tei en 04 de Febrero de 2008, 10:02:43 AM
Cita de: "J_F_NASH"
int ancho = 10;
int alto = 10;
int arreglo[ancho][alto]

Veo que esto no es posible, ancho y alto deben ser constantes. Si no me equivoco tengo dos opciones para resolver esto:
-Listas enlazadas: Me ha parecido demasiado complicado para meterme en tal berengenal.
-Memoria Dinámica. Utilizando malloc/free: Parece mas fácil pero ¿cómo puedo aplicarlo a un arreglo bidimensional?

¿Hay otra alternativas? ¿cual es la forma mas simple de hacer esto?

S2.

Es que en tu codigo no hay costantes como las que te funcionarian en este caso:


#define LOQUESEA_ALTO 10
#define LOQUESEA_ANCHO 10

int arreglo[LOQUESEA_ALTO][LOQUESEA_ANCHO]


Lo de las listas enlazadas simplemente para hacer un array bidimensional es matar moscas a cañonazos.

Estoy un poco oxidado de C, pero creo que con memoria dinamica tendria algo como este aspecto:

int * arreglo;

arreglo = (int *)malloc( LOQUESEA_ALTO*LOQUESEA_ANCHO*sizeof(int));


Tu código no se si compilaría si en vez de ser C fuera C++ haciendo este cambio:

const ancho = 10;
const alto = 10;
int arreglo[ancho][alto]

Ya digo que no se si compilaria. Probablemente.
Título: Declarar un arreglo bidimensional de tamaño variable en C.
Publicado por: Pogacha en 04 de Febrero de 2008, 10:47:17 AM

int * arreglo;

arreglo = (int *)malloc( LOQUESEA_ALTO*LOQUESEA_ANCHO*sizeof(int));

Esto esta bien y luego para acceder a una celda en particular (x,y):

arreglo[x + y* LOQUESEA_ALTO]
Título: Declarar un arreglo bidimensional de tamaño variable en C.
Publicado por: Martinez en 04 de Febrero de 2008, 10:53:54 AM
Para que sea bidimensional tb te vale esto

int **arreglo;

areglo=(int**)malloc(sizeof(int*) * filas);

int i;
for(i=0; i<filas; i++)
 arreglo[i]=(int*)malloc(sizeof(int)*columnas);



Para acceder a un elemnto basta con:
arreglo[fila][columna]=2;


Y para liberar la memoria:
for(int i=0; i<filas; i++)
   free(arreglo[i]);
free(arreglo);


Y si usas C++:

int filas=2, columnas=3;

vector< vector<int> > arreglo(filas); // ojo espacios entre > y >

for(int i=0; i<filas; i++)
arreglo[i]=vector<int>(columnas);
   
               arreglo[0][0]=3; // Casca si fuera de rango
arreglo.at(0).at(0)=3;  // Tira excepcion si fuera de rango

No hace falta eliminar memoria ya que lo hace el destructor de la clase vector.

Edit: error en el for del primer codigo
Título: Declarar un arreglo bidimensional de tamaño variable en C.
Publicado por: shephiroth en 04 de Febrero de 2008, 07:20:06 PM
y no es mas facil...

int matriz[][];
int filas = 10;
int colum = 20;
matriz = new int[filas][columnas];
matriz[0][6]=10;


Eso si, necesitaras el "delete[][] matriz";
Título: Declarar un arreglo bidimensional de tamaño variable en C.
Publicado por: Pogacha en 04 de Febrero de 2008, 09:32:05 PM
Cita de: "shephiroth"y no es mas facil...

int matriz[][];
int filas = 10;
int colum = 20;
matriz = new int[filas][columnas];
matriz[0][6]=10;


Eso si, necesitaras el "delete[][] matriz";

Esto no creo que ande ... no se en que lenguaje puede que si pero ni en C++ y menos C.
Tal vez en uno manejado o algo raro que no conozca.

Saludos
Título: Declarar un arreglo bidimensional de tamaño variable en C.
Publicado por: Loover en 04 de Febrero de 2008, 09:33:27 PM
En Java andaría, o algo por el estilo :P, pero en c/c++, ni de coña. La solución de de Martinez es la que suelo usar yo.
Título: Declarar un arreglo bidimensional de tamaño variable en C.
Publicado por: shephiroth en 06 de Febrero de 2008, 08:47:56 AM
Teneis razon, me confundi con java, c no permite crear matrices de una tirada, hay q hacerlo en dos pasos ^^;