En aquest tema, aprendrem com passar arguments a subrutines i funcions en Fortran. Això és essencial per escriure codi modular i reutilitzable. Veurem com es poden passar arguments per valor i per referència, i com gestionar arrays i altres tipus de dades com arguments.
Conceptes Clau
-
Arguments per Valor vs. Arguments per Referència:
- Per Valor: Es passa una còpia del valor a la subrutina o funció.
- Per Referència: Es passa una referència a la variable original, permetent que la subrutina o funció modifiqui el valor original.
-
Declaració d'Arguments:
- Els arguments es declaren a la línia de capçalera de la subrutina o funció.
- Es poden especificar tipus de dades per als arguments.
-
Passant Arrays com Arguments:
- Els arrays es poden passar a subrutines i funcions de manera similar a les variables simples.
- És important especificar la dimensió de l'array.
Exemples Pràctics
Exemple 1: Passant Arguments per Valor
program main implicit none integer :: a, b a = 5 b = 10 print *, 'Abans de la crida: a =', a, ', b =', b call swap_by_value(a, b) print *, 'Després de la crida: a =', a, ', b =', b contains subroutine swap_by_value(x, y) integer, value :: x, y integer :: temp temp = x x = y y = temp end subroutine swap_by_value end program main
Explicació:
- En aquest exemple,
swap_by_value
intenta intercanviar els valors dea
ib
. - Els arguments
x
iy
es passen per valor, així que els canvis dins de la subrutina no afecten les variables originalsa
ib
.
Exemple 2: Passant Arguments per Referència
program main implicit none integer :: a, b a = 5 b = 10 print *, 'Abans de la crida: a =', a, ', b =', b call swap_by_reference(a, b) print *, 'Després de la crida: a =', a, ', b =', b contains subroutine swap_by_reference(x, y) integer :: x, y integer :: temp temp = x x = y y = temp end subroutine swap_by_reference end program main
Explicació:
- En aquest exemple,
swap_by_reference
intercanvia els valors dea
ib
. - Els arguments
x
iy
es passen per referència, així que els canvis dins de la subrutina afecten les variables originalsa
ib
.
Exemple 3: Passant Arrays com Arguments
program main implicit none integer, dimension(5) :: arr = [1, 2, 3, 4, 5] print *, 'Array abans de la crida: ', arr call modify_array(arr) print *, 'Array després de la crida: ', arr contains subroutine modify_array(a) integer, dimension(:) :: a integer :: i do i = 1, size(a) a(i) = a(i) * 2 end do end subroutine modify_array end program main
Explicació:
- En aquest exemple,
modify_array
modifica els elements de l'arrayarr
. - L'array
a
es passa per referència, així que els canvis dins de la subrutina afecten l'array originalarr
.
Exercicis Pràctics
Exercici 1: Intercanvi de Valors
Escriu una subrutina swap
que intercanviï els valors de dues variables enteres passades per referència. Prova la subrutina en un programa principal.
Exercici 2: Suma d'Elements d'un Array
Escriu una funció sum_array
que prengui un array d'enters com a argument i retorni la suma dels seus elements. Prova la funció en un programa principal.
Exercici 3: Multiplicació d'Elements d'un Array
Escriu una subrutina multiply_array
que prengui un array d'enters i un enter factor
com a arguments, i multipliqui cada element de l'array pel factor
. Prova la subrutina en un programa principal.
Solucions
Solució 1: Intercanvi de Valors
program main implicit none integer :: a, b a = 5 b = 10 print *, 'Abans de la crida: a =', a, ', b =', b call swap(a, b) print *, 'Després de la crida: a =', a, ', b =', b contains subroutine swap(x, y) integer :: x, y integer :: temp temp = x x = y y = temp end subroutine swap end program main
Solució 2: Suma d'Elements d'un Array
program main implicit none integer, dimension(5) :: arr = [1, 2, 3, 4, 5] integer :: result result = sum_array(arr) print *, 'La suma dels elements de l''array és: ', result contains function sum_array(a) result(sum) integer, dimension(:) :: a integer :: sum integer :: i sum = 0 do i = 1, size(a) sum = sum + a(i) end do end function sum_array end program main
Solució 3: Multiplicació d'Elements d'un Array
program main implicit none integer, dimension(5) :: arr = [1, 2, 3, 4, 5] integer :: factor factor = 3 print *, 'Array abans de la crida: ', arr call multiply_array(arr, factor) print *, 'Array després de la crida: ', arr contains subroutine multiply_array(a, factor) integer, dimension(:) :: a integer :: factor integer :: i do i = 1, size(a) a(i) = a(i) * factor end do end subroutine multiply_array end program main
Conclusió
En aquesta secció, hem après com passar arguments a subrutines i funcions en Fortran, incloent variables simples i arrays. Hem vist la diferència entre passar arguments per valor i per referència, i hem practicat amb exemples i exercicis. Aquest coneixement és fonamental per escriure codi modular i reutilitzable en Fortran. En la següent secció, explorarem l'abast i la durada de les variables.
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