martes, 14 de abril de 2009

Construir arrays dinámicos de dos dimensiones en C

Aquí sólo explicare la idea de como construir arrays de dos dimensiones en C/C++ usando la función de este post.

Lo primero que hay que tener en cuenta, es que todo se va a construir a base de arrays de una sola dimensión, así que debemos separar una mjatriz en arrays de una dimensión. Tomemos por ejemplo la construcción de una matriz de 3x4:

a3x4La separamos en tres arrays unidimensionales de tamaño 4:

tresarrayde4Dado que esos tres arrays no pueden estar sueltos, necesitamos una lista que nos apunte a cada uno de los arrays unidimensionales, que lo vamnos a dar como un array de tamaño 3 (hay tres arrays a los que queremos enlistar):

arraydeapuntadorY ya con eso tenemos nuestra matriz de 3x4.

Ahora, los arrays involucardos (que son 4 en total para este caso) son de distinto tipo. Para indicar el tipo del array, se pone el tipo de valoires que enlista seguido de un arterico.  Los tres primeros arrays unidimensionales enlistantes flotantes, es decir a cosas de tipo float, asi que el tipo de estos vectores es "float *". Ahora, el cuarto vector, es una lista de los anteriores, osea, una lista de los "float *", por lo que el tipo de este vector debe ser "float **" (agregamos un astericso al final del tipo al que apunta, que es float *).

Ahora vamos a construir la matriz con código, usando el mismo código que se muestra aca:

Ejemplo básico de como pedir memoria para una matriz y liberarla


entonces primero debemos construir el array que enlista cada uno de los renglones, porque si no no vamos a tener donde guardarlos.  Declaramos entonces nuestra matriz como apuntador a doble flotante (linea 4 del codigo) :

[sourcecode language="cpp"]float **m;[/sourcecode]

Omiti lo de incializar en NULL como se muestra en el codigo original, porque es s[olo para manejo de errores y validacion, y no es necesairo ahorita.

Bueno, prosigamos. Debemos pedir espacio en memoria para almacenar las direcciones de cada uno de los renglones (nr) y eso lo hacemso con esta linea de c[odigo (linea 6)

[sourcecode language="cpp"]m=(float **) malloc(nr*sizeof(float*));[/sourcecode]

Esta linea dice que vamos a pedir memoria (con malloc) para nr elementos, que sonde tipo "float *" (cada uno de los renglones de la matriz). La funcion malloc regresa la dirección de esa memoria que pedimos, y la converitmos a float ** y guardamos ese valor en m.



Ahora hay que pedir memoria para cada uno de los renglones de la matriz, y eso lo hacemos con el siguiente código (lineas 8 a 12):

[sourcecode language="cpp"]for (i=0;i<nr;i++)
{
m[i]=(float *) malloc(nc*sizeof(float));
}
[/sourcecode]

Este for construte cada uno de los renlones de la matriz. Dentro del for, se pide memoria con malloc para nc elementos (tantos como columnas) de tipo float. malloc regresa la direccion en memoria de ese arrays, lo converitmos a "float *" y guardamos esa direccion de memoria en la i-ésima entrada de m, que es m[i].

Y ya este es todo el cödigo necesaria (lo demás que hay en el código original es para validación y control de errores), ya podemos acceder a cada elemento de la matriz como normalmente se haria, por ejemplo al elemento 1,2 seria m[1][2].

1 comentario:

  1. Hi, interest post. I'll write you later about few questions!

    ResponderEliminar