2010-08-19 14 views
2

La sous-routine Rule_Tn de la bibliothèque Fortran CUBPACK nécessite un paramètre Integrand décrivant la fonction vectorielle intégrée. Il est unComment Fortran retourne-t-il les baies?

INTERFACE 
    FUNCTION Integrand(NF,X) RESULT(Value) 
     USE Precision_Model 
     INTEGER,      INTENT(IN) :: NF 
     REAL(KIND=STND), DIMENSION(:), INTENT(IN) :: X 
     REAL(KIND=STND), DIMENSION(NF)    :: Value 
    END FUNCTION Integrand 
END INTERFACE 

Depuis que je veux appeler Rule_Tn à partir du code C je dois définir un type de fonction en C correspondant exactement à cette interface ci-dessus. J'ai donc essayé de comprendre comment une fonction Fortran retourne des tableaux. Au début, j'ai supposé la signature C suivante

void Integrand(double* value, const int* nf, const int* x); 

correspond à l'interface ci-dessus. Mais loin faux! J'ai une erreur de segmentation. Et j'ai déjà testé que le double est le type correspondant à REAL(KIND=STND), le STND sort du module Precision_Model.

Maintenant, quelqu'un peut-il me dire quelle est la bonne signature? J'utilise les compilateurs GNU Fortran et C.

Répondre

1

Voir GNU docs. Il semble que vous ayez fourni les arguments dans un ordre différent entre Fortran et C. Essayez de mettre value en dernier dans le prototype C. En outre, il vous manque bind(C) sur la ligne FUNCTION.

+0

Ce n'est pas le point, la valeur de 'STND' est définie dans le module' Precision_Model' et j'ai déjà testé que 'REAL (KIND = STND)' correspond à 'double'. La question est: Quelle est la signature C correspondante à cette interface? – phlipsy

+2

@phlipsy: vous voudrez peut-être changer le libellé "fourni", alors. Mise à jour de la réponse – Potatoswatter

+0

Ok, j'ai reformulé cette partie de ma question. – phlipsy