Introducció

L'assignació dinàmica de memòria és una tècnica que permet als programes gestionar la memòria de manera flexible durant l'execució. En Fortran, aquesta capacitat és especialment útil per treballar amb arrays de mida variable, estructures de dades complexes i per optimitzar l'ús de recursos de memòria.

Conceptes Clau

  1. Memòria Estàtica vs Dinàmica:

    • Memòria Estàtica: La mida de les estructures de dades es defineix en temps de compilació.
    • Memòria Dinàmica: La mida de les estructures de dades es pot definir i modificar en temps d'execució.
  2. Operacions Principals:

    • ALLOCATION: Assigna memòria a una variable.
    • DEALLOCATION: Allibera la memòria assignada a una variable.

Sintaxi Bàsica

ALLOCATION

La instrucció ALLOCATE s'utilitza per assignar memòria a una variable dinàmica.

INTEGER, ALLOCATABLE :: array(:)
INTEGER :: n

! Definir la mida de l'array
n = 10

! Assignar memòria a l'array
ALLOCATE(array(n))

DEALLOCATION

La instrucció DEALLOCATE s'utilitza per alliberar la memòria assignada a una variable dinàmica.

! Alliberar la memòria de l'array
DEALLOCATE(array)

Exemple Pràctic

A continuació, es mostra un exemple complet que il·lustra l'ús de l'assignació dinàmica de memòria en Fortran.

PROGRAM dynamic_memory_example
  IMPLICIT NONE
  INTEGER, ALLOCATABLE :: array(:)
  INTEGER :: n, i

  ! Demanar a l'usuari la mida de l'array
  PRINT *, 'Introdueix la mida de l''array:'
  READ *, n

  ! Assignar memòria a l'array
  ALLOCATE(array(n))

  ! Omplir l'array amb valors
  DO i = 1, n
    array(i) = i * 2
  END DO

  ! Mostrar els valors de l'array
  PRINT *, 'Valors de l''array:'
  DO i = 1, n
    PRINT *, 'array(', i, ') = ', array(i)
  END DO

  ! Alliberar la memòria de l'array
  DEALLOCATE(array)

END PROGRAM dynamic_memory_example

Explicació del Codi

  1. Declaració de l'Array:

    INTEGER, ALLOCATABLE :: array(:)
    

    Declarem un array dinàmic utilitzant l'atribut ALLOCATABLE.

  2. Lectura de la Mida de l'Array:

    PRINT *, 'Introdueix la mida de l''array:'
    READ *, n
    

    Demanem a l'usuari que introdueixi la mida de l'array.

  3. Assignació de Memòria:

    ALLOCATE(array(n))
    

    Assignem memòria a l'array amb la mida especificada per l'usuari.

  4. Omplir l'Array:

    DO i = 1, n
      array(i) = i * 2
    END DO
    

    Omplim l'array amb valors.

  5. Mostrar els Valors de l'Array:

    PRINT *, 'Valors de l''array:'
    DO i = 1, n
      PRINT *, 'array(', i, ') = ', array(i)
    END DO
    

    Mostrem els valors de l'array.

  6. Alliberar la Memòria:

    DEALLOCATE(array)
    

    Alliberem la memòria assignada a l'array.

Exercicis Pràctics

Exercici 1

Escriu un programa que llegeixi una sèrie de nombres enters des de l'entrada estàndard, els emmagatzemi en un array dinàmic i calculi la seva mitjana.

Solució

PROGRAM average_calculation
  IMPLICIT NONE
  INTEGER, ALLOCATABLE :: numbers(:)
  INTEGER :: n, i, sum
  REAL :: average

  ! Demanar a l'usuari la quantitat de nombres
  PRINT *, 'Introdueix la quantitat de nombres:'
  READ *, n

  ! Assignar memòria a l'array
  ALLOCATE(numbers(n))

  ! Llegir els nombres
  PRINT *, 'Introdueix els nombres:'
  DO i = 1, n
    READ *, numbers(i)
  END DO

  ! Calcular la suma
  sum = 0
  DO i = 1, n
    sum = sum + numbers(i)
  END DO

  ! Calcular la mitjana
  average = REAL(sum) / REAL(n)

  ! Mostrar la mitjana
  PRINT *, 'La mitjana és: ', average

  ! Alliberar la memòria de l'array
  DEALLOCATE(numbers)

END PROGRAM average_calculation

Exercici 2

Escriu un programa que creï una matriu dinàmica de dimensions especificades per l'usuari, ompli la matriu amb valors aleatoris i calculi la suma de tots els elements.

Solució

PROGRAM matrix_sum
  IMPLICIT NONE
  REAL, ALLOCATABLE :: matrix(:,:)
  INTEGER :: rows, cols, i, j
  REAL :: sum

  ! Demanar a l'usuari les dimensions de la matriu
  PRINT *, 'Introdueix el nombre de files:'
  READ *, rows
  PRINT *, 'Introdueix el nombre de columnes:'
  READ *, cols

  ! Assignar memòria a la matriu
  ALLOCATE(matrix(rows, cols))

  ! Omplir la matriu amb valors aleatoris
  CALL RANDOM_SEED()
  DO i = 1, rows
    DO j = 1, cols
      CALL RANDOM_NUMBER(matrix(i, j))
    END DO
  END DO

  ! Calcular la suma de tots els elements
  sum = 0.0
  DO i = 1, rows
    DO j = 1, cols
      sum = sum + matrix(i, j)
    END DO
  END DO

  ! Mostrar la suma
  PRINT *, 'La suma de tots els elements és: ', sum

  ! Alliberar la memòria de la matriu
  DEALLOCATE(matrix)

END PROGRAM matrix_sum

Errors Comuns i Consells

  1. No Alliberar Memòria:

    • És important alliberar la memòria assignada per evitar fuites de memòria.
    • Utilitza DEALLOCATE per alliberar memòria quan ja no sigui necessària.
  2. Accés a Memòria No Assignada:

    • Assegura't que la memòria ha estat assignada abans d'accedir-hi.
    • Utilitza la funció ALLOCATED per verificar si una variable ha estat assignada.
    IF (.NOT. ALLOCATED(array)) THEN
      ALLOCATE(array(n))
    END IF
    
  3. Errors en la Mida de l'Array:

    • Verifica que la mida de l'array sigui correcta abans d'assignar memòria.
    • Evita assignar memòria amb mides negatives o zero.

Conclusió

L'assignació dinàmica de memòria en Fortran és una eina poderosa que permet als programes gestionar la memòria de manera flexible i eficient. Mitjançant l'ús de les instruccions ALLOCATE i DEALLOCATE, els programadors poden crear estructures de dades de mida variable i optimitzar l'ús de recursos de memòria. Practicar amb exemples i exercicis és essencial per dominar aquesta tècnica i evitar errors comuns.

© Copyright 2024. Tots els drets reservats