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

  1. 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.
  2. 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.
  3. 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 de a i b.
  • Els arguments x i y es passen per valor, així que els canvis dins de la subrutina no afecten les variables originals a i b.

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 de a i b.
  • Els arguments x i y es passen per referència, així que els canvis dins de la subrutina afecten les variables originals a i b.

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'array arr.
  • L'array a es passa per referència, així que els canvis dins de la subrutina afecten l'array original arr.

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.

© Copyright 2024. Tots els drets reservats