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 :

Porter programme fortran de linux à windows


Sujet :

Fortran

  1. #1
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2009
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2009
    Messages : 128
    Points : 71
    Points
    71
    Par défaut Porter programme fortran de linux à windows
    Bonjour,

    Je suis en train d'essayer de porter un programme de linux à windows. Ce programme a été écrit sur Fortran 77 (c'est un vieux programme).
    Ce que j'ai fait pour le moment c'est télécharger Visual Studio 2008 et Intel Visual Fortran.

    Les fichiers sources initiaux sont en .f et .h. Je n'ai pas réussi à les compiler direct sur windows avec visual studio. Je me suis dit donc, c'est pas grave, je mets tout en fortran 90 et avoir des fichiers en .f90 et .fi pour les headers. Mais a priori j'ai plein de problèmes de syntaxe notamment pour la commande Format.

    J'ai donc 2 questions svp:
    1) Est ce qu'il y a une méthode plus simple que ce que je suis en train de faire pour le moment?

    2) Comment écrire Format sur fortran 90, j'ai regardé dans des cours, mais je ne trouve pas une réponse claire.

    Merci d'avance.

  2. #2
    Membre éprouvé
    Avatar de Ladgalen
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2007
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 466
    Points : 982
    Points
    982
    Par défaut
    Bonjour

    Du moment que tu as un compilateur fortran77 de windows, a priori le code devrait être portable sauf si tu as à l'intérieur des call system(" ") car ils font appel à des commandes sytème.

    Pour ce qui est du format, en F90 voici deux solutions :

    1) tu l'indique direct
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    write(*,fmt="(F10.3,i7,E16.6)") a, b ,c
    2) tu l'indiques dans une variable de caractère ce qui te permet de le réutiliser.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    format1 = "(F10.3,i7,E16.6)"
    write(*,fmt=format1) a, b ,c
    le fmt= est facultatif.

    Pour ce qui est des headers, à partir de fortran 90 il ne devrait plus y en avoir. Normalement les anciens common et include du F77 sont remplacés par des modules.

  3. #3
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2009
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2009
    Messages : 128
    Points : 71
    Points
    71
    Par défaut
    Merci beaucoup Mais j'ai un autre petit problème :p

    Après avoir rêvé de Fortran toute la nuit (oui je fais souvent ce genre de rêves érotiques), je me suis réveillé ce matin en me disant "quel con!!"
    Au fait j'arrive à complier les fichiers .f et .h direct avec visual studio 2008.

    Donc là j'ai compilé et je suis content, mais quand je fais build, un message d'erreur qui se répète 28 fois et qui a priori n'a pas lieu d'être apparait, c'est:

    Erreur 21 error #6186: This character is not valid in a format list [...]

    avec [...] le caractère en question.

    Je précise aussi que quand je compile sur linux, tout est niquel et je n'ai porté aucune modification sur les fichiers de code.

  4. #4
    Membre éprouvé
    Avatar de Ladgalen
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2007
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 466
    Points : 982
    Points
    982
    Par défaut
    Tu pourrais donner un bout de code avec le format en question, ça nous permettra de voir ce qui cloche.

  5. #5
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2009
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2009
    Messages : 128
    Points : 71
    Points
    71
    Par défaut
    Oui bien sûr

    WRITE(7,*)
    1 ' plot \'toto.his\' index 1 with lines lt 0 lw 2 notitle, \\',
    2 ' \'toto.his\' index 2 with lines lt 0 lw 2 notitle, \\',
    3 ' \'toto.his\' index 3 with lines lt 3 lw 4 notitle, \\',
    4 ' \'toto.his\' index 4 with lines lt 1 lw 4 notitle'


    et il me sort comme erreurs à la compilation:

    error #5078: Unrecognized token '\' skipped
    error #5144: Invalid character_kind_parameter. No underscore
    error #5082: Syntax error, found IDENTIFIER 'TOTO' when expecting one of: ( * ) :: , <END-OF-STATEMENT> ; + . - (/ [ : ] /) ' ** / // > ...

    Voilà le genre d'erreurs qui se répètent.

    Il y a aussi la partie suivante:

    FORMAT(' with lines title \'',A3,'_{',I1,I1,'}\', \\')

    et comme erreurs:

    error #6186: This character is not valid in a format list. [}]
    error #6186: This character is not valid in a format list. [_]

    Et ainsi de suite.

    Voilà.

    EDIT :
    Juste une petite précision, pour la première partie du code avec write, cette commande est pour tracer dans un fichier des courbes avec gnuplot.

  6. #6
    Membre éprouvé
    Avatar de Ladgalen
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2007
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 466
    Points : 982
    Points
    982
    Par défaut
    Qu'est ce que c'est toto.his ? Une variable fortran ne peut pas avoir ce type de nom, seul le caractère _ est autorisé en plus des lettres et des chiffres (sauf en premier).

    Pour le second format tu attend quoi en sortie ? les { doivent apparaitre où il font partie de la syntaxe du format ?

    En fait je crois comprendre ... tu me diras si je me plante, les \' doivent avoir pour but d'insérer un ' à l'intérieur de deux ' '. Essaye plutot comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
          WRITE(7,*)
         1 ' plot ''toto.his'' index 1 with lines lt 0 lw 2 notitle, \\',
         2 ' ''toto.his'' index 2 with lines lt 0 lw 2 notitle, \\',
         3 ' ''toto.his'' index 3 with lines lt 3 lw 4 notitle, \\',
         4 ' ''toto.his'' index 4 with lines lt 1 lw 4 notitle'
    et ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
          FORMAT(' with lines title '' ',A3,'_{',I1,I1,'} '', \\')
    sinon il faut mettre les ' entre " (les quotes entre guillements)

    Evite aussi le write(7,*), il est préférable de commencer à 9 ou 10 car les 8 ou 9 premiers numéros logiques sont réservés.

  7. #7
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2009
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2009
    Messages : 128
    Points : 71
    Points
    71
    Par défaut
    Merci beaucoup, a priori ce que tu me dis marche. Bon, j'ai encore 8 erreurs mais il s'agit d'erreurs d'une autre nature. J'ai 8 erreurs de link là du style

    error LNK2001: symbole externe non résolu _ABEND

    Où abend est l'une des subroutines du programme. J'ai un problème avec 7 autres subroutines. Si t'as une piste d'où proviendrait ce genre d'erreurs, tu me dépannerais vraiment beaucoup.

    Pour toto.his, c'est un fichier historique que le programme est censé créer et dans lequel laisse une trace des opérations faites.

    Pour la seconde partie et les {, je t'avoue que j'en sais rien :p
    C'est pas moi qui ai écrit ce programme, moi mon boulot c'est le mettre sur windows et lui faire une interface graphique.

  8. #8
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2009
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2009
    Messages : 128
    Points : 71
    Points
    71
    Par défaut
    Merci de m'avoir aidé, j'ai trouvé d'où vient les erreurs de link. Je ne réussis pas à installer la librairies qui contient ces subroutines.
    Ma dernière question est donc je pense: comment installer une cernlib sur windows si ça existe sur windows??????

  9. #9
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2009
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2009
    Messages : 128
    Points : 71
    Points
    71
    Par défaut
    Tous mes problèmes sont résolus
    Merci infiniment.

  10. #10
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2009
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2009
    Messages : 128
    Points : 71
    Points
    71
    Par défaut
    Bonjour,

    Je reviens solliciter votre aide de nouveau parce que j'ai un autre type de problème maintenant. J'ai réussi à résoudre tous les problèmes de la compilation et de l'édition des liens et j'arrive à avoir un fichier exécutable. Le nouveau problème que je rencontre maintenant c'est un problème de gestion de la mémoire.
    Comme j'ai dit précédemment, sur linux mon programme marchait niquel et lors du portage je n'ai rien modifié dans les fichiers sources.

    J'ai dans un header la ligne suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     COMMON/COM07/ PPRO(0:3),RPRO(4)
    cette ligne faisait en sorte que quand je finis de remplir le tableau ppro il passe tout seul au tableau rpro. et donc dans la subroutine suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
          DO 2 J=0,7
    2     PPRO(J)=P(J)
    passait très bien. Sur windows ce n'est plus le cas. SVP pourquoi ça ne passe plus? Et qu'est-ce que je pourrais bien faire?

    Merci.

  11. #11
    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 Sieur_Blabla Voir le message
    J'ai dans un header la ligne suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     COMMON/COM07/ PPRO(0:3),RPRO(4)
    cette ligne faisait en sorte que quand je finis de remplir le tableau ppro il passe tout seul au tableau rpro. et donc dans la subroutine suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
          DO 2 J=0,7
    2     PPRO(J)=P(J)
    passait très bien. Sur windows ce n'est plus le cas. SVP pourquoi ça ne passe plus? Et qu'est-ce que je pourrais bien faire?
    Simple précision: « il ne passe pas tour seul au tableau rpro ». C'est simplement que le common t'assure que les 4 espaces après PPRO(3) sont occupées par RPRO.

    Ceci dit, il m'est difficile de trouver l'erreur avec l'info que tu donnes. Tout semble OK. Comment les variables sont-elles déclarées ? Un cas où ça ne marcherait pas, c'est si PPRO est double precision alors que RPRO serait en simple précision. L'espace réservé par RPRO serait alors trop court.

  12. #12
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2009
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2009
    Messages : 128
    Points : 71
    Points
    71
    Par défaut
    Ils sont déclarés tous les deux simple précision. Moi non plus je ne comprends pas du tout pourquoi ça ne marche pas en théorie ça devrait marcher.
    windows est vraiment nul, je comprends pas pourquoi les gens continuent à travailler avec.

  13. #13
    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 Sieur_Blabla Voir le message
    ...windows est vraiment nul, je comprends pas pourquoi les gens continuent à travailler avec.
    Tu as 22 ans? Ça te laisse beaucoup de temps pour réaliser que dans la vie, il est rare que la majorité des gens aient tord...

    Cela dit, le problème est dans ton programme. Il n'est pas dans le compilateur (c'est rarement la cause), et encore moins dans Windows (encore plus rare).

    Le problème peut être « préexistant » dans ton programme. Le fait de changer de compilateur et de système d'exploitation, en réorganisant la mémoire, rend le problème apparent. C'est une situation très fréquente.

    Pourquoi dis-tu que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DO 2 J=0,7
    2     PPRO(J)=P(J)
    ne passe plus ? Quel message d'erreur as-tu ?

  14. #14
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2009
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2009
    Messages : 128
    Points : 71
    Points
    71
    Par défaut
    looool oui t'as peut être raison :p

    Au fait quand j'exécute le programme avec l'invite de commande, j'obtiens ça:

    forrtl: severe (408): fort: (2): Subscript #1 of the array P has value 4 which i
    s greater than the upper bound of 3

    fort est le fichier d'entrée dans lequel le programme est censé lire.
    et ça m'indique après le numéro de la ligne de l'instruction avec le Do.

  15. #15
    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
    Aaaaah !

    Mais y-en a pas de problème, ou si peu. C'est simplement que tu as activé le "bound check" à la compilation et que tu essaies de référencer l'élément (4) qui n'existe pas (évidemment) parce que déclarer (0:3).

    Solutions :
    • enlever le bound-check. C'est triste parce que c'est une bonne idée de faire ce test.
    • Déclarer PPRO(0:7) et "mapper" RPRO par dessus avec une equivalence.
    • Revoir la stratégie.

    Je commencerais par la solution 2 en modifiant comme suit le common :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    common /.../PPRO(0:7)
    real RPRO(4)
    equivalence (PPRO(4),RPRO(1))
    Si ça ne marche pas, j'essayerais 1. En dernier recours, la solution 3.

    Note: J'ai un vieux programme critique qui présente ce problème et j'ai opté pour la solution 1.

  16. #16
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2009
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2009
    Messages : 128
    Points : 71
    Points
    71
    Par défaut
    La bound-check était déjà enlevée, et la solution 2 n'a rien changé, il me retourne à la fin le même message d'erreur.
    Je crois qu'il ne reste plus que revoir la stratégie :s

  17. #17
    Membre éprouvé
    Avatar de Ladgalen
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2007
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 466
    Points : 982
    Points
    982
    Par défaut
    Bonjour

    Je ne sais pas qu'elle est la taille du code ni le nombre de fois où ce cas de figure apparait ni le temps que tu souhaites y consacrer. Cependant c'est quand même un peu biscornue la façon le programme remplis RPRO !

    Au lieu de chercher une autre solution détournée, pourquoi ne pas simplement écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    do j=1,4
      PPRO(J)=P(J)
    end do
    do j=5,7
      RPRO(J)=P(J)
    end do
    Si tu peux le faire et que tu ne dois par reprendre tout le code, c'est quand même un moindre effort ! et en plus ton programme gagne largement en lisibilité.

  18. #18
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2009
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2009
    Messages : 128
    Points : 71
    Points
    71
    Par défaut
    Je suis parfaitement d'accord et c'est ce que je voulais faire depuis le début. Mais mon maître de stage refuse. Il me dit cherche encore un peu, je veux pas que tu modifie mon code.

    Je continue de chercher une solution là, j'ai vu que peut être rajouter l'option -align à la compilation marcherait. Donc là je sais pas le faire sur visual studio, donc je cherche où ajouter des options de compilation.

  19. #19
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2009
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2009
    Messages : 128
    Points : 71
    Points
    71
    Par défaut
    l'otion aligner les common marche pas

  20. #20
    Membre éprouvé
    Avatar de Ladgalen
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2007
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 466
    Points : 982
    Points
    982
    Par défaut
    Dommage

    Moi je testerais l'option

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    --reproposer de faire des modifs au directeur de stage
    Si ton objectif c'est de faire une interface graphique il est quand même préférable d'avoir un code qui soit portable (tu en fais une démonstration flagrante qu'il ne l'est pas) et robuste ... donc faire des modifications qui vont dans ce sens ça peut s'argumenter. Ensuite il faudra bien sur faire ce qu'on appelle des "tests de non regressions" pour faire attention à chaque modification que les résultats sont identiques à ceux des versions antérieures.

    Bon courage

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Kylix] Porter un programme Windows sous Linux
    Par bryce426 dans le forum EDI
    Réponses: 5
    Dernier message: 19/02/2010, 13h29
  2. conversion programmes fortran windows vers linux
    Par epinephryne dans le forum Fortran
    Réponses: 2
    Dernier message: 16/06/2009, 21h02
  3. Programmation de socket linux sous windows
    Par neuro6 dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 16/10/2007, 18h35
  4. Porter un code source delphi windows à linux
    Par Coussati dans le forum Delphi
    Réponses: 4
    Dernier message: 08/10/2006, 00h58
  5. Programme C passage de Linux à Windows
    Par romzaide dans le forum C
    Réponses: 6
    Dernier message: 08/11/2005, 10h47

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