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 main
En 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 main
En 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 main
En 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 main
En 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
globalCounter
en un mòdul. - Escriu una subrutina que incrementi
globalCounter
i 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 main
Exercici 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 main
Conclusió
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