En este tema, exploraremos dos conceptos fundamentales en la programación: el alcance y la vida útil de las variables. Estos conceptos determinan dónde y cuándo se puede acceder a una variable en un programa. Comprender estos conceptos es crucial para escribir código eficiente y libre de errores.

  1. Alcance de las Variables

El alcance de una variable se refiere a la región del programa donde la variable es accesible. En Fortran, el alcance de una variable puede ser:

  • Local: La variable es accesible solo dentro del bloque de código donde se declara.
  • Global: La variable es accesible en todo el programa.

1.1 Alcance Local

Las variables locales se declaran dentro de subrutinas, funciones o bloques de código. Solo son accesibles dentro de ese bloque específico.

program local_scope_example
    implicit none
    call my_subroutine()
contains
    subroutine my_subroutine()
        integer :: local_var
        local_var = 10
        print *, "Local variable value: ", local_var
    end subroutine my_subroutine
end program local_scope_example

En este ejemplo, local_var es una variable local de la subrutina my_subroutine y no es accesible fuera de ella.

1.2 Alcance Global

Las variables globales se declaran fuera de cualquier subrutina o función y son accesibles en todo el programa.

program global_scope_example
    implicit none
    integer :: global_var
    global_var = 20
    call my_subroutine()
    print *, "Global variable value in main program: ", global_var
contains
    subroutine my_subroutine()
        print *, "Global variable value in subroutine: ", global_var
    end subroutine my_subroutine
end program global_scope_example

En este ejemplo, global_var es una variable global y es accesible tanto en el programa principal como en la subrutina my_subroutine.

  1. Vida Útil de las Variables

La vida útil de una variable se refiere al tiempo durante el cual la variable existe en la memoria. En Fortran, la vida útil de una variable puede ser:

  • Automática: La variable existe solo durante la ejecución del bloque de código donde se declara.
  • Estática: La variable existe durante toda la ejecución del programa.

2.1 Variables Automáticas

Las variables automáticas se crean cuando se entra en el bloque de código donde se declaran y se destruyen cuando se sale de ese bloque.

program automatic_lifetime_example
    implicit none
    call my_subroutine()
contains
    subroutine my_subroutine()
        integer :: auto_var
        auto_var = 30
        print *, "Automatic variable value: ", auto_var
    end subroutine my_subroutine
end program automatic_lifetime_example

En este ejemplo, auto_var es una variable automática que solo existe durante la ejecución de my_subroutine.

2.2 Variables Estáticas

Las variables estáticas se declaran con el atributo save y existen durante toda la ejecución del programa.

program static_lifetime_example
    implicit none
    call my_subroutine()
    call my_subroutine()
contains
    subroutine my_subroutine()
        integer, save :: static_var = 0
        static_var = static_var + 1
        print *, "Static variable value: ", static_var
    end subroutine my_subroutine
end program static_lifetime_example

En este ejemplo, static_var es una variable estática que conserva su valor entre llamadas a my_subroutine.

Ejercicios Prácticos

Ejercicio 1: Alcance de Variables

  1. Escribe un programa que declare una variable global y una variable local. Modifica ambas variables en una subrutina y muestra sus valores en el programa principal.

Ejercicio 2: Vida Útil de Variables

  1. Escribe un programa que utilice una variable automática y una variable estática dentro de una subrutina. Llama a la subrutina varias veces y observa cómo cambian los valores de las variables.

Soluciones

Solución Ejercicio 1

program scope_exercise
    implicit none
    integer :: global_var
    global_var = 5
    call modify_variables()
    print *, "Global variable in main program: ", global_var
contains
    subroutine modify_variables()
        integer :: local_var
        local_var = 10
        global_var = global_var + 1
        print *, "Local variable in subroutine: ", local_var
        print *, "Global variable in subroutine: ", global_var
    end subroutine modify_variables
end program scope_exercise

Solución Ejercicio 2

program lifetime_exercise
    implicit none
    call test_lifetime()
    call test_lifetime()
contains
    subroutine test_lifetime()
        integer :: auto_var
        integer, save :: static_var = 0
        auto_var = 0
        auto_var = auto_var + 1
        static_var = static_var + 1
        print *, "Automatic variable value: ", auto_var
        print *, "Static variable value: ", static_var
    end subroutine test_lifetime
end program lifetime_exercise

Conclusión

En esta sección, hemos aprendido sobre el alcance y la vida útil de las variables en Fortran. Comprender estos conceptos es esencial para escribir programas eficientes y evitar errores comunes relacionados con el acceso y la gestión de variables. En el siguiente módulo, exploraremos estructuras de datos avanzadas, lo que nos permitirá manejar datos de manera más compleja y eficiente.

© Copyright 2024. Todos los derechos reservados