IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Fortran Discussion :

Programme C++ / Fortran sous Visual 6 - Convention d'appel


Sujet :

Fortran

  1. #1
    Candidat au Club
    Inscrit en
    Septembre 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Programme C++ / Fortran sous Visual 6 - Convention d'appel
    Bonjour,

    Je dois développer sous Visual 6 un programme en C++ faisant également appel à des sous-routines en Fortran. Le travail s'est déroulé, en utilisant en option pour les Calling Convention (Convention d'appels), stdcall, et en écrivant en C++ les déclarations de sous-routines fortran sous la forme :

    extern "C" __stdcall void NOMDEFONCTION(int*,int*);

    Tous semble se gater sous Visual 6 lorsque je veux également passer des chaines de caractères, en plus des entiers, comme argument :

    J'ai essayé de conserver les mêmes conventions stdcall, de les enlever ou de jouer sur les déclarations avec :


    extern "C" __stdcall void NOMDEFONCTION(int*,int*, char*);

    ou

    extern "C" void NOMDEFONCTION(int*,int*, char*);

    Mais rien ne semble fonctionner ! Au pire la compilation est refusée avec les messages :

    main.obj : error LNK2001: unresolved external symbol _FONCTION1@12
    main.obj : error LNK2001: unresolved external symbol _FONCTION2@16

    Au mieux, j'ai changé les conventions d'appel du projet principal et de celui contenant les fichiers fortran, en ' cdecl ', qui doivent permettre de développer la librairire fortran qui est liée au projet.
    Mais dans cette situation, l'éxécution démarre correctement avec de s'arrêter, notamment en raison de passages incorrects des valeurs entières dans les sous-routines fortran

    Quelqu'un pourrait-il me renseigner et m'indiquer quelles sont les conventions d'écriture des méthodes et de leur déclaration pour permettre le passage de chaine de caractères de c++ à fortran ?

    Cmment réaliser cet appel, en passant quand même des chaines de caractères en argument ?

    Il semble que ce point est le seul bloquant car les sous-routines ne passant pas de chaines de caractère fonctionnent parfaitement.

    Je galère sur ce projet, ce qui est d'autant plus rageant car il fonctionne correctement sous Visual 2005, mais les noms des conventions d'appel sont différents de V6. Cependant, je dois maintenant le redévelopper sous Visual 6 d'où mes difficultés.

    D'avance merci de votre aide,

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Août 2006
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 974
    Points : 1 346
    Points
    1 346
    Par défaut
    La grande majorité des compilateurs Fortran ajoute un argument de longueur lors du passage des chaînes de caractères. Ce paramètre est caché en Fortran, mais doit être explicite dans les autres langages. Il y a autant d'argument caché qu'il y a d'argument caractère, et ils sont passés (généralement) par valeur et non par référence, à la fin de la liste d'arguments.

    Le prototype devient alors :

    extern "C" __stdcall void NOMDEFONCTION(int*,int*, char*, int);

  3. #3
    Candidat au Club
    Inscrit en
    Septembre 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Complément + Resultat
    OK,

    Super !!
    Cela fonctionne maintenant correctement avec la correction proposée.
    Je n'ai rien touché en fortran mais j'ai modifié la ligne de déclaration des sous-routines en c++ par celle proposée et rajoutée la longueur de la chaine de caractères en argument dans les lignes nécessaires.

    Question subsidiaire : est-ce que cela fonctionnera systématiquement pour toutes les options envisageables du projet c++ en visual 6 cad _cdecl et _stdcall ? il semble que cela soit le cas car, pour peu que le terme _stdcall soit précisé avant les définitions des fonctions en en-tête du main.cpp, la compilation et l'éxécution semblent valable.

    Encore merci,

    GaetanNe

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Août 2006
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 974
    Points : 1 346
    Points
    1 346
    Par défaut
    Citation Envoyé par GaetanNe Voir le message
    est-ce que cela fonctionnera systématiquement pour toutes les options envisageables du projet c++ en visual 6 cad _cdecl et _stdcall ?
    Je ne vois pas trop le lien. Je crois que oui. Quelqu'un d'autre maitrise mieux le sujet ?

  5. #5
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Si c'est un stdcall, normalement ça devrait passer si ton code Fortran est du Fortran 77 voire 90 sans module. Sinon, il y a le module ISO_C_BINDING qui te permettra de t'assurer les types qui proviennent de ton code C++.
    Le gros souci est de savoir si le nom de tes fonctions Fortran est en majuscules, en minuscules, avec un "_" postfixé, 2, aucun... C'est dépendnat su compilateur, tout comme les bibliothèques support.

Discussions similaires

  1. Programmer en C sous visual studio 2005
    Par superseb801 dans le forum VC++ .NET
    Réponses: 2
    Dernier message: 22/09/2007, 14h03
  2. Programme à developper sous visual basic 2005
    Par seb_de_quimper dans le forum VB.NET
    Réponses: 15
    Dernier message: 07/03/2007, 23h29
  3. Réponses: 15
    Dernier message: 13/01/2007, 11h22
  4. Fonction en DLL sous Visual Compaq Fortran
    Par zerbault dans le forum Fortran
    Réponses: 1
    Dernier message: 04/01/2007, 11h05
  5. programmer en c sous microsoft visual studio 2005
    Par chrysmac2003 dans le forum Visual C++
    Réponses: 11
    Dernier message: 02/10/2006, 18h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo