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
-
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ó.
-
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.
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
-
Declaració de l'Array:
INTEGER, ALLOCATABLE :: array(:)
Declarem un array dinàmic utilitzant l'atribut
ALLOCATABLE
. -
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.
-
Assignació de Memòria:
ALLOCATE(array(n))
Assignem memòria a l'array amb la mida especificada per l'usuari.
-
Omplir l'Array:
DO i = 1, n array(i) = i * 2 END DO
Omplim l'array amb valors.
-
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.
-
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
-
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.
-
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
-
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.
Curs de Programació en Fortran
Mòdul 1: Introducció a Fortran
- Introducció a Fortran
- Configuració de l'Entorn de Desenvolupament
- Sintaxi i Estructura Bàsiques
- Escrivint el teu Primer Programa en Fortran
Mòdul 2: Conceptes Bàsics
- Variables i Tipus de Dades
- Operadors i Expressions
- Entrada i Sortida
- Estructures de Control: Sentències If
- Estructures de Control: Bucles
Mòdul 3: Arrays i Cadenes
Mòdul 4: Procediments i Funcions
Mòdul 5: Estructures de Dades Avançades
Mòdul 6: Gestió de Fitxers
Mòdul 7: Temes Avançats
Mòdul 8: Millors Pràctiques i Optimització
- Tècniques d'Optimització de Codi
- Depuració i Perfilat
- Escrivint Codi Mantenible
- Estàndards i Portabilitat de Fortran