La asignación dinámica de memoria es una característica poderosa en Fortran que permite a los programadores gestionar la memoria de manera eficiente durante la ejecución del programa. Esto es especialmente útil cuando el tamaño de los datos no se conoce de antemano y puede cambiar durante la ejecución del programa.
Conceptos Clave
- Asignación Dinámica: Permite reservar memoria en tiempo de ejecución.
- Deallocación: Libera la memoria previamente asignada.
- Punteros: Referencias a ubicaciones de memoria que pueden cambiar durante la ejecución del programa.
Declaración de Variables Dinámicas
En Fortran, las variables dinámicas se declaran utilizando la palabra clave ALLOCATABLE
. Aquí hay un ejemplo básico:
program dynamic_memory_example implicit none integer, allocatable :: array(:) end program dynamic_memory_example
En este ejemplo, array
es un arreglo de tamaño dinámico.
Asignación de Memoria
Para asignar memoria a una variable ALLOCATABLE
, se utiliza la instrucción ALLOCATE
:
program dynamic_memory_example implicit none integer, allocatable :: array(:) integer :: n ! Solicitar el tamaño del arreglo al usuario print *, 'Ingrese el tamaño del arreglo:' read *, n ! Asignar memoria para el arreglo allocate(array(n)) ! Inicializar el arreglo array = 0 ! Mostrar el contenido del arreglo print *, 'Contenido del arreglo:', array ! Liberar la memoria asignada deallocate(array) end program dynamic_memory_example
Explicación del Código
- Declaración:
integer, allocatable :: array(:)
declara un arreglo de enteros de tamaño dinámico. - Lectura del Tamaño:
read *, n
lee el tamaño del arreglo desde la entrada estándar. - Asignación de Memoria:
allocate(array(n))
asigna memoria paran
enteros. - Inicialización:
array = 0
inicializa todos los elementos del arreglo a 0. - Liberación de Memoria:
deallocate(array)
libera la memoria asignada.
Ejemplo Práctico: Matriz Dinámica
A continuación, se muestra un ejemplo más complejo que utiliza una matriz bidimensional de tamaño dinámico:
program dynamic_matrix_example implicit none integer, allocatable :: matrix(:,:) integer :: rows, cols, i, j ! Solicitar el tamaño de la matriz al usuario print *, 'Ingrese el número de filas:' read *, rows print *, 'Ingrese el número de columnas:' read *, cols ! Asignar memoria para la matriz allocate(matrix(rows, cols)) ! Inicializar la matriz do i = 1, rows do j = 1, cols matrix(i, j) = i * j end do end do ! Mostrar el contenido de la matriz print *, 'Contenido de la matriz:' do i = 1, rows print *, matrix(i, :) end do ! Liberar la memoria asignada deallocate(matrix) end program dynamic_matrix_example
Explicación del Código
- Declaración:
integer, allocatable :: matrix(:,:)
declara una matriz de enteros de tamaño dinámico. - Lectura del Tamaño:
read *, rows
yread *, cols
leen el número de filas y columnas desde la entrada estándar. - Asignación de Memoria:
allocate(matrix(rows, cols))
asigna memoria para una matriz derows
xcols
. - Inicialización: Los bucles
do
inicializan cada elemento de la matriz con el producto de sus índices. - Liberación de Memoria:
deallocate(matrix)
libera la memoria asignada.
Ejercicios Prácticos
Ejercicio 1: Vector Dinámico
Objetivo: Escribir un programa que lea un número n
y luego lea n
números enteros, almacenándolos en un vector dinámico. Finalmente, el programa debe imprimir el vector.
Solución:
program dynamic_vector implicit none integer, allocatable :: vector(:) integer :: n, i ! Leer el tamaño del vector print *, 'Ingrese el tamaño del vector:' read *, n ! Asignar memoria para el vector allocate(vector(n)) ! Leer los elementos del vector print *, 'Ingrese los elementos del vector:' do i = 1, n read *, vector(i) end do ! Mostrar el contenido del vector print *, 'Contenido del vector:' print *, vector ! Liberar la memoria asignada deallocate(vector) end program dynamic_vector
Ejercicio 2: Matriz de Suma
Objetivo: Escribir un programa que lea dos matrices de tamaño m x n
y calcule su suma, almacenando el resultado en una tercera matriz dinámica.
Solución:
program matrix_sum implicit none integer, allocatable :: matrix1(:,:), matrix2(:,:), result(:,:) integer :: rows, cols, i, j ! Leer el tamaño de las matrices print *, 'Ingrese el número de filas:' read *, rows print *, 'Ingrese el número de columnas:' read *, cols ! Asignar memoria para las matrices allocate(matrix1(rows, cols)) allocate(matrix2(rows, cols)) allocate(result(rows, cols)) ! Leer los elementos de la primera matriz print *, 'Ingrese los elementos de la primera matriz:' do i = 1, rows do j = 1, cols read *, matrix1(i, j) end do end do ! Leer los elementos de la segunda matriz print *, 'Ingrese los elementos de la segunda matriz:' do i = 1, rows do j = 1, cols read *, matrix2(i, j) end do end do ! Calcular la suma de las matrices result = matrix1 + matrix2 ! Mostrar el resultado print *, 'Resultado de la suma de las matrices:' do i = 1, rows print *, result(i, :) end do ! Liberar la memoria asignada deallocate(matrix1) deallocate(matrix2) deallocate(result) end program matrix_sum
Errores Comunes y Consejos
- No Liberar Memoria: Siempre asegúrate de liberar la memoria asignada utilizando
deallocate
para evitar fugas de memoria. - Asignación Doble: No intentes asignar memoria a una variable que ya tiene memoria asignada sin liberarla primero.
- Acceso Fuera de Rango: Asegúrate de que los índices utilizados para acceder a los arreglos estén dentro del rango asignado.
Conclusión
La asignación dinámica de memoria en Fortran es una herramienta esencial para escribir programas flexibles y eficientes. Permite gestionar la memoria de manera efectiva, adaptándose a las necesidades cambiantes durante la ejecución del programa. Con la práctica, podrás utilizar estas técnicas para resolver problemas complejos de manera eficiente.
En el próximo tema, exploraremos las listas enlazadas, una estructura de datos avanzada que se beneficia enormemente de la asignación dinámica de memoria.
Curso de Programación en Fortran
Módulo 1: Introducción a Fortran
- Introducción a Fortran
- Configuración del Entorno de Desarrollo
- Sintaxis y Estructura Básica
- Escribiendo tu Primer Programa en Fortran
Módulo 2: Conceptos Básicos
- Variables y Tipos de Datos
- Operadores y Expresiones
- Entrada y Salida
- Estructuras de Control: Sentencias If
- Estructuras de Control: Bucles
Módulo 3: Arreglos y Cadenas
- Introducción a los Arreglos
- Arreglos Multidimensionales
- Manejo de Cadenas
- Operaciones con Arreglos y Cadenas
Módulo 4: Procedimientos y Funciones
Módulo 5: Estructuras de Datos Avanzadas
Módulo 6: Manejo de Archivos
- Lectura de Archivos
- Escritura de Archivos
- Posicionamiento de Archivos
- Operaciones con Archivos Binarios
Módulo 7: Temas Avanzados
Módulo 8: Mejores Prácticas y Optimización
- Técnicas de Optimización de Código
- Depuración y Perfilado
- Escribiendo Código Mantenible
- Estándares y Portabilidad de Fortran