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_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:
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_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:
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_multiply
Exercici 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_string
Compila 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