Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Declarar un arreglo bidimensional de tamaño variable en C.

Iniciado por J_F_NASH, 04 de Febrero de 2008, 08:37:22 AM

« anterior - próximo »

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.

Tei

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.

Pogacha


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]

Martinez

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

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";

Pogacha

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

Loover

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.
IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!

shephiroth

Teneis razon, me confundi con java, c no permite crear matrices de una tirada, hay q hacerlo en dos pasos ^^;






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.