En aquest tema, explorarem dos conceptes fonamentals en la programació: l'abast (scope) i la durada (lifetime) de les variables. Aquests conceptes determinen on i quan es poden utilitzar les variables en un programa Fortran.
- Abast de les Variables
L'abast d'una variable es refereix a la regió del codi on la variable és accessible. En Fortran, l'abast de les variables es pot dividir en dos tipus principals:
1.1. Abast Local
Les variables locals són aquelles que es declaren dins d'un bloc de codi, com ara una subrutina, una funció o un bloc DO. Aquestes variables només són accessibles dins del bloc on es declaren.
Exemple:
program main
implicit none
call exampleSubroutine()
contains
subroutine exampleSubroutine()
integer :: localVar
localVar = 10
print *, "Valor de localVar dins de la subrutina: ", localVar
end subroutine exampleSubroutine
end program mainEn aquest exemple, localVar és una variable local de la subrutina exampleSubroutine i no és accessible fora d'aquesta subrutina.
1.2. Abast Global
Les variables globals són aquelles que es declaren fora de qualsevol subrutina o funció, normalment al començament del programa o en un mòdul. Aquestes variables són accessibles des de qualsevol part del programa.
Exemple:
module globalModule
implicit none
integer :: globalVar
end module globalModule
program main
use globalModule
implicit none
globalVar = 20
call exampleSubroutine()
print *, "Valor de globalVar en el programa principal: ", globalVar
contains
subroutine exampleSubroutine()
use globalModule
print *, "Valor de globalVar dins de la subrutina: ", globalVar
end subroutine exampleSubroutine
end program mainEn aquest exemple, globalVar és una variable global declarada en el mòdul globalModule i és accessible tant des del programa principal com des de la subrutina exampleSubroutine.
- Durada de les Variables
La durada d'una variable es refereix al temps durant el qual la variable existeix en la memòria durant l'execució del programa. En Fortran, la durada de les variables es pot dividir en dos tipus principals:
2.1. Durada Automàtica
Les variables automàtiques són aquelles que es creen quan s'entra en el bloc de codi on es declaren i es destrueixen quan se surt d'aquest bloc. Aquest és el comportament per defecte de les variables locals.
Exemple:
program main
implicit none
call exampleSubroutine()
contains
subroutine exampleSubroutine()
integer :: localVar
localVar = 10
print *, "Valor de localVar dins de la subrutina: ", localVar
end subroutine exampleSubroutine
end program mainEn aquest exemple, localVar es crea quan s'entra en la subrutina exampleSubroutine i es destrueix quan se surt d'aquesta subrutina.
2.2. Durada Estàtica
Les variables estàtiques són aquelles que es mantenen en la memòria durant tota l'execució del programa. Aquestes variables es poden declarar utilitzant l'atribut save.
Exemple:
program main
implicit none
call exampleSubroutine()
call exampleSubroutine()
contains
subroutine exampleSubroutine()
integer, save :: staticVar = 0
staticVar = staticVar + 1
print *, "Valor de staticVar dins de la subrutina: ", staticVar
end subroutine exampleSubroutine
end program mainEn aquest exemple, staticVar és una variable estàtica que conserva el seu valor entre les crides a la subrutina exampleSubroutine.
Exercicis Pràctics
Exercici 1: Variables Locals i Globals
- Declara una variable global
globalCounteren un mòdul. - Escriu una subrutina que incrementi
globalCounteri imprimeixi el seu valor. - Crida la subrutina diverses vegades des del programa principal i observa el valor de
globalCounter.
Solució:
module counterModule
implicit none
integer :: globalCounter = 0
end module counterModule
program main
use counterModule
implicit none
call incrementCounter()
call incrementCounter()
call incrementCounter()
contains
subroutine incrementCounter()
use counterModule
globalCounter = globalCounter + 1
print *, "Valor de globalCounter: ", globalCounter
end subroutine incrementCounter
end program mainExercici 2: Variables Estàtiques
- Escriu una subrutina que utilitzi una variable estàtica per comptar el nombre de vegades que s'ha cridat.
- Crida la subrutina diverses vegades des del programa principal i imprimeix el nombre de crides.
Solució:
program main
implicit none
call countCalls()
call countCalls()
call countCalls()
contains
subroutine countCalls()
integer, save :: callCount = 0
callCount = callCount + 1
print *, "Nombre de crides a la subrutina: ", callCount
end subroutine countCalls
end program mainConclusió
En aquesta secció, hem après sobre l'abast i la durada de les variables en Fortran. Hem vist com les variables locals i globals tenen diferents àmbits d'aplicació i com les variables automàtiques i estàtiques tenen diferents durades de vida. Aquests conceptes són fonamentals per escriure codi Fortran eficient i mantenible. En la propera secció, explorarem les estructures de dades avançades en Fortran.
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
