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
- Interoperabilitat: Capacitat de dos sistemes o llenguatges per treballar junts.
- ISO_C_BINDING: Mòdul de Fortran que proporciona les eines necessàries per interfaciarnos amb C.
- 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.
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_functionPas 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:
Hauries de veure la sortida:
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_argsPas 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:
Hauries de veure la sortida:
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
- 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.
- 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:
! 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_multiplyExercici 2:
! 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_stringCompila i enllaça els fitxers de manera similar als exemples anteriors per veure els resultats.
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
