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

  1. Asignación Dinámica: Permite reservar memoria en tiempo de ejecución.
  2. Deallocación: Libera la memoria previamente asignada.
  3. 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

  1. Declaración: integer, allocatable :: array(:) declara un arreglo de enteros de tamaño dinámico.
  2. Lectura del Tamaño: read *, n lee el tamaño del arreglo desde la entrada estándar.
  3. Asignación de Memoria: allocate(array(n)) asigna memoria para n enteros.
  4. Inicialización: array = 0 inicializa todos los elementos del arreglo a 0.
  5. 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

  1. Declaración: integer, allocatable :: matrix(:,:) declara una matriz de enteros de tamaño dinámico.
  2. Lectura del Tamaño: read *, rows y read *, cols leen el número de filas y columnas desde la entrada estándar.
  3. Asignación de Memoria: allocate(matrix(rows, cols)) asigna memoria para una matriz de rows x cols.
  4. Inicialización: Los bucles do inicializan cada elemento de la matriz con el producto de sus índices.
  5. 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

  1. No Liberar Memoria: Siempre asegúrate de liberar la memoria asignada utilizando deallocate para evitar fugas de memoria.
  2. Asignación Doble: No intentes asignar memoria a una variable que ya tiene memoria asignada sin liberarla primero.
  3. 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.

© Copyright 2024. Todos los derechos reservados