Aufruf eines C-Unterprogramms von Fortran-90

Fortran-90 Hauptprogramm

Das Problem: Fortran übergibt nicht die Werte, sondern die Adressen der Parameter (call by reference) ans Unterprogramm.
program rufe_C

  integer :: a, b
  a = 2
  b = 3
  write(*,'(A,I2," ",I2/)',ADVANCE='NO') " Vor dem Tausch: ", a, b
  call tausche(a, b)
  write(*,'(A,I2," ",I2)',ADVANCE='NO')  "Nach dem Tausch: ", a, b
  
end program rufe_C

Das C-Unterprogramm

void tausche(int * a, int * b)
{
 int temp;
 temp = *a;
 *a = *b;
 *b = temp; 
}

Das Interface

Da der Fortran-95-Compiler den Namen des Unterprogramms automatisch um ein "_" verlängert, wird dieses Interface-Programm benötigt: Fortran ruft diese Routine tausch, die ihreseits die Parameter 1 zu 1 an das Fortran-Unterprogramm tausch_ weitergibt.
/* Interface f90 <-> c */
/* tausche_f90_c.c     */

void tausche_( int *a, int *b) 
{
	tausche(a,b);
}

Der Makefile

( gcc -c tausche.c )
( gcc -c tausche_f90_c.c)
f95 rufe_c.f90 tausche.c tausche_f90_c.c
F95 = f95
CC  = gcc

rufe_C: rufe_C.o tausche.o tausche_f90_c.o
	$(F95) rufe_C.o tausche.o tausche_f90_c.o  -o rufe_C

tausche.o: tausche.c
	$(CC) -c   tausche.c 
tausche_f90_c.o: tausche_f90_c.c
	$(CC) -c   tausche_f90_c.c 
rufe_C.o: rufe_C.f90
	$(F95) -c   rufe_C.f90

exec: rufe_C 
	./rufe_C
# ------------------------------------------------------------
clean :
	/bin/rm -rf rufe_C *.o 


Achtung: Die Einrückung ist ein TAB