Programación en C/Matrices Dinámicas
Como ya hemos visto el lenguaje de programación C posee la capacidad de poder asignar nuevos espacios de memoria para variables bidimensionales, como los arreglos de caracteres el cual en momentos que el programa se ejecuta no se sabe con certeza cuanto espacio ocupara una cadena de caracteres , dando así la posibilidad de asignar memoria al arreglo , re dimensionar y posteriormente a liberarlo.
En este punto nos centraremos en las matrices dinámicas las cuales pueden cambiar su tamaño en tiempo de ejecución si el usuario lo desea, esto es valido para arreglos unidimensionales, bidimensionales, tridimensionales o multidimensionales. Teniendo en cuenta que las matrices bidimensionales son tablas con las cordenadas (X,Y) pudiendo crecer tanto en las coordenadas X como en las Y, y en tridimensionales con coordenadas cambiantes en (X,Y,Z) o multidimensionales con mas coordenadas de tablas. Nos centraremos en las bidimensionales que son las mas útiles ya que se usa para el manejo de tablas con coordenadas (X,Y) que varían en tiempo de ejecución.
Ejemplo 1 - Creando arreglo bidimensional que soporte de columnas y filas de manera variable.
/*
Creado por Juan Carlos Lanuza L.
ATLAS Laboratories
UNICIT Universidad Iberoamericana de Ciencia y Tecnología
Managua Nicaragua 2017
OPEN SOURCE CODE - Libre modificación y distribución
*/
#include <stdio.h>
#include <stdlib.h>
int **matrix = NULL; // se asgina el NULL en caso de valores erráticos
int main(void)
{
int col,fil; // almacenan las cantidades de columnas y filas
int x,y; // para el movimiento entre los arreglos
fprintf(stdout,"Ingresa Columnas: ");
scanf("%d",&col);
fprintf(stdout,"Ingresa Filas: ");
scanf("%d",&fil);
matrix = (int **)malloc(fil*sizeof(int*)); // se asigna memoria para las filas
if(matrix == NULL) { perror(""); } // se comprueba si no hay errores
for (int i = 1;i <= fil;i++) // se inicia un movimiento en el arreglo para asignar memoria para las columnas
{
matrix[i] = (int*)malloc(col*sizeof(int)); // se asigna memoria mientras se mueve por el arreglo
if(matrix[i] == NULL) perror("Error: "); // se comprueba que no hay errores
}
for(y = 0;y < fil;y++) // esto nos movera por las filas
{
for(x = 0;x < col;x++) // esto nos movera por las columnas
{
fprintf(stdout,"Valor [%d][%d] : ",y,x); // nos imprimira por que columna y fila (coordenada) estamos
scanf("%d",&matrix[y][x]); // se asigna el valor a la matrix
}
}
puts("Matriz Actual");
puts("-------------");
for(y = 0;y < fil;y++)
{
for(x = 0;x < col;x++)
{
fprintf(stdout,"%d\t",matrix[y][x]); // se imprime los resultados para la visualización previa
}
puts(\n);// salto de linea
}
free(matrix); // se libera la memoria asignada a la matriz si asi se requiere
matrix = NULL; // se asigna NULL por metodos de seguridad
return 0;
}