La sobrecàrrega d'operadors és una característica poderosa en Fortran que permet definir o redefinir el comportament dels operadors per a tipus de dades definits per l'usuari. Això pot fer que el codi sigui més llegible i natural, especialment quan es treballa amb tipus de dades complexos.
Conceptes Clau
- Definició d'Operadors: En Fortran, es poden sobrecarregar operadors aritmètics, lògics i de comparació.
- Tipus Derivats: La sobrecàrrega d'operadors s'utilitza sovint amb tipus derivats (tipus definits per l'usuari).
- Interfícies: Les interfícies són necessàries per declarar la sobrecàrrega d'operadors.
Exemples Pràctics
Exemple 1: Sobrecàrrega de l'Operador +
Suposem que tenim un tipus derivat vector
i volem sobrecarregar l'operador +
per sumar dos vectors.
module vector_operations implicit none private public :: vector, operator(+) type :: vector real :: x, y, z end type vector interface operator(+) module procedure add_vectors end interface contains function add_vectors(v1, v2) result(v3) type(vector), intent(in) :: v1, v2 type(vector) :: v3 v3%x = v1%x + v2%x v3%y = v1%y + v2%y v3%z = v1%z + v2%z end function add_vectors end module vector_operations
Explicació del Codi
- Definició del Mòdul: El mòdul
vector_operations
conté la definició del tipusvector
i la sobrecàrrega de l'operador+
. - Tipus Derivat: El tipus
vector
té tres components reals:x
,y
iz
. - Interfície: La interfície
operator(+)
declara que la funcióadd_vectors
s'utilitzarà per sobrecarregar l'operador+
. - Funció de Sobrecàrrega: La funció
add_vectors
suma els components corresponents de dos vectors i retorna el resultat.
Exemple 2: Sobrecàrrega de l'Operador ==
Ara, sobrecarregarem l'operador ==
per comparar dos vectors.
module vector_operations implicit none private public :: vector, operator(==) type :: vector real :: x, y, z end type vector interface operator(==) module procedure equal_vectors end interface contains function equal_vectors(v1, v2) result(is_equal) type(vector), intent(in) :: v1, v2 logical :: is_equal is_equal = (v1%x == v2%x) .and. (v1%y == v2%y) .and. (v1%z == v2%z) end function equal_vectors end module vector_operations
Explicació del Codi
- Interfície: La interfície
operator(==)
declara que la funcióequal_vectors
s'utilitzarà per sobrecarregar l'operador==
. - Funció de Sobrecàrrega: La funció
equal_vectors
compara els components corresponents de dos vectors i retornatrue
si tots els components són iguals, ifalse
en cas contrari.
Exercicis Pràctics
Exercici 1: Sobrecàrrega de l'Operador *
Crea un mòdul que defineixi un tipus matrix
i sobrecarregui l'operador *
per multiplicar dues matrius.
Solució
module matrix_operations implicit none private public :: matrix, operator(*) type :: matrix real, dimension(:,:), allocatable :: elements end type matrix interface operator(*) module procedure multiply_matrices end interface contains function multiply_matrices(m1, m2) result(m3) type(matrix), intent(in) :: m1, m2 type(matrix) :: m3 integer :: i, j, k integer :: n, m, p n = size(m1%elements, 1) m = size(m1%elements, 2) p = size(m2%elements, 2) allocate(m3%elements(n, p)) m3%elements = 0.0 do i = 1, n do j = 1, p do k = 1, m m3%elements(i, j) = m3%elements(i, j) + m1%elements(i, k) * m2%elements(k, j) end do end do end do end function multiply_matrices end module matrix_operations
Explicació del Codi
- Tipus Derivat: El tipus
matrix
conté un array bidimensionalelements
. - Interfície: La interfície
operator(*)
declara que la funciómultiply_matrices
s'utilitzarà per sobrecarregar l'operador*
. - Funció de Sobrecàrrega: La funció
multiply_matrices
realitza la multiplicació de matrius utilitzant el mètode clàssic de multiplicació de matrius.
Resum
La sobrecàrrega d'operadors en Fortran permet definir comportaments personalitzats per a operadors en tipus de dades definits per l'usuari. Això pot fer que el codi sigui més llegible i natural. Hem vist com sobrecarregar operadors aritmètics i de comparació, i hem practicat amb exercicis per reforçar els conceptes apresos.
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