Introducció

En aquest tema, aprendrem com interfaciarnos amb el llenguatge de programació C des de Fortran. Aquesta habilitat és especialment útil quan volem aprofitar biblioteques escrites en C o quan necessitem integrar codi Fortran en aplicacions més grans escrites en C.

Objectius

  • Entendre com cridar funcions de C des de Fortran.
  • Aprendre a passar arguments entre Fortran i C.
  • Gestionar la interoperabilitat entre els dos llenguatges.

Conceptes Clau

  1. Interoperabilitat: Capacitat de dos sistemes o llenguatges per treballar junts.
  2. ISO_C_BINDING: Mòdul de Fortran que proporciona les eines necessàries per interfaciarnos amb C.
  3. BIND(C): Atribut de Fortran que s'utilitza per especificar que una funció o variable és interoperable amb C.

Configuració de l'Entorn

Abans de començar, assegura't de tenir instal·lats els compiladors de Fortran i C. Per exemple, pots utilitzar gfortran per Fortran i gcc per C.

Cridant Funcions de C des de Fortran

Pas 1: Escriure la Funció en C

Primer, escrivim una funció simple en C que volem cridar des de Fortran. Guardem aquest codi en un fitxer anomenat c_function.c.

// c_function.c
#include <stdio.h>

void hello_from_c() {
    printf("Hello from C!\n");
}

Pas 2: Escriure el Codi Fortran

Ara, escrivim el codi Fortran que cridarà la funció hello_from_c. Guardem aquest codi en un fitxer anomenat fortran_program.f90.

! fortran_program.f90
program call_c_function
    use iso_c_binding
    implicit none

    interface
        subroutine hello_from_c() bind(C)
            use iso_c_binding
        end subroutine hello_from_c
    end interface

    ! Cridar la funció de C
    call hello_from_c()

end program call_c_function

Pas 3: Compilar i Enllaçar

Compila i enllaça els fitxers C i Fortran. Pots utilitzar les següents comandes:

gcc -c c_function.c
gfortran -c fortran_program.f90
gfortran -o program fortran_program.o c_function.o

Pas 4: Executar el Programa

Executa el programa resultant:

./program

Hauries de veure la sortida:

Hello from C!

Passant Arguments entre Fortran i C

Pas 1: Escriure la Funció en C amb Arguments

Modifiquem la funció en C per acceptar arguments. Guardem aquest codi en un fitxer anomenat c_function_with_args.c.

// c_function_with_args.c
#include <stdio.h>

void print_sum(int a, int b) {
    printf("The sum is: %d\n", a + b);
}

Pas 2: Escriure el Codi Fortran amb Arguments

Modifiquem el codi Fortran per passar arguments a la funció de C. Guardem aquest codi en un fitxer anomenat fortran_program_with_args.f90.

! fortran_program_with_args.f90
program call_c_function_with_args
    use iso_c_binding
    implicit none

    interface
        subroutine print_sum(a, b) bind(C)
            use iso_c_binding
            integer(c_int), value :: a, b
        end subroutine print_sum
    end interface

    ! Variables
    integer(c_int) :: x, y

    ! Assignar valors
    x = 5
    y = 10

    ! Cridar la funció de C amb arguments
    call print_sum(x, y)

end program call_c_function_with_args

Pas 3: Compilar i Enllaçar

Compila i enllaça els fitxers C i Fortran. Pots utilitzar les següents comandes:

gcc -c c_function_with_args.c
gfortran -c fortran_program_with_args.f90
gfortran -o program_with_args fortran_program_with_args.o c_function_with_args.o

Pas 4: Executar el Programa

Executa el programa resultant:

./program_with_args

Hauries de veure la sortida:

The sum is: 15

Resum

En aquesta secció, hem après com interfaciarnos amb el llenguatge de programació C des de Fortran. Hem vist com cridar funcions de C, passar arguments i compilar i enllaçar els nostres programes. Aquesta habilitat ens permet aprofitar biblioteques escrites en C i integrar codi Fortran en aplicacions més grans.

Exercicis Pràctics

  1. Exercici 1: Escriu una funció en C que multipliqui dos nombres i retorna el resultat. Crida aquesta funció des de Fortran i mostra el resultat.
  2. Exercici 2: Escriu una funció en C que accepti una cadena de caràcters i la imprimeixi. Crida aquesta funció des de Fortran passant-li una cadena.

Solucions

Exercici 1:

// c_multiply.c
#include <stdio.h>

int multiply(int a, int b) {
    return a * b;
}
! fortran_multiply.f90
program call_c_multiply
    use iso_c_binding
    implicit none

    interface
        function multiply(a, b) bind(C)
            use iso_c_binding
            integer(c_int), value :: a, b
            integer(c_int) :: multiply
        end function multiply
    end interface

    ! Variables
    integer(c_int) :: x, y, result

    ! Assignar valors
    x = 5
    y = 10

    ! Cridar la funció de C i obtenir el resultat
    result = multiply(x, y)

    ! Mostrar el resultat
    print *, "The product is: ", result

end program call_c_multiply

Exercici 2:

// c_print_string.c
#include <stdio.h>

void print_string(const char* str) {
    printf("%s\n", str);
}
! fortran_print_string.f90
program call_c_print_string
    use iso_c_binding
    implicit none

    interface
        subroutine print_string(str) bind(C)
            use iso_c_binding
            character(kind=c_char), dimension(*), intent(in) :: str
        end subroutine print_string
    end interface

    ! Variable
    character(kind=c_char, len=20) :: message

    ! Assignar valor
    message = "Hello from Fortran"

    ! Cridar la funció de C
    call print_string(message)

end program call_c_print_string

Compila i enllaça els fitxers de manera similar als exemples anteriors per veure els resultats.

© Copyright 2024. Tots els drets reservats