Bonjour,

Admettons le code Fortran suivant (add_f.f90) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
function add(x, y)
 
    implicit none
 
    double precision             :: add
    double precision, intent(in) :: x, y
 
    add = x + y
 
end function add
Je peux le compiler en une library comme ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
gfortran -c -fno_underscoring add_f.90
gfortran -shared -fPIC -o add_f.so add_f.o
Je peux vérifier le contenu de la library :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
nm -D add_f.so
00000000000010f9 T add
                 w __cxa_finalize
                 w __gmon_start__
                 w _ITM_deregisterTMCloneTable
                 w _ITM_registerTMCloneTable
Je souhaite maintenant appeler la fonction add depuis un script Python. Je me suis inspiré pour cela du sujet suivant : https://www.developpez.net/forums/d2.../#post11404304

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import ctypes
 
# Définition de la fonction add depuis la library
libf = ctypes.CDLL('add_f.so')
func = libf.add
 
# Définition du type des arguments et de la sortie
func.argtypes = [ctypes.c_double, ctypes.c_double]
func.restype = ctypes.c_double
 
# test
res = func(1.2, 3)
 
print(res)
Qui me renvoie un messagre d'erreur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
/tmp/geany_run_script_SE8FJ0.sh: line 7: 54151 Segmentation fault
Si je ne spécifie pas le type des arguments j'ai un message d'erreur de type TypeError.

Qu'est-ce qui est incorrect ici ?

J