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 :

[Fortran 90] Code retour d'une routine avec return ?


Sujet :

Fortran

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juin 2002
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 37
    Points : 29
    Points
    29
    Par défaut [Fortran 90] Code retour d'une routine avec return ?
    bonjour,

    J'viens solliciter nos experts ès fortran (90).


    Je voudrais dans une routine fortran, pouvoir renvoyer une valeur de retour. Un code, spécifiant si la routine s'est bien déroulée ou s'il y a eu une erreur, et éventuellement renvoyer un code erreur différent selon le type d'erreur invoqué.

    Exemple : une routine de lecture de données dans un fichier.

    3 codes de retour.

    Ok = 1 => Tout s'est bien passé !
    File_Not_Found = 2 => Le fichier est introuvable !
    Data_corrupted = 3 => Les données du fichier ne sont pas cohérentes avec ce qui est attendu.

    Là, j'hésite entre 3 solutions :

    - en faire une fonction et donc le code retour est la valeur de la fonction
    - ajouter un argument à la routine
    - utiliser le 'return'

    A la base, j'irais naturellement vers l'usage du return, mais qu'en pensez-vous ?

  2. #2
    Membre éclairé Avatar de genteur slayer
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2002
    Messages : 710
    Points : 825
    Points
    825
    Par défaut
    je pencherai sur le résultat d'une fonction... car dans un "call" il ne me semble pas qu'il y ait un moyen de faire du return...

    cela dit pour le cas d'une ouverture de fichier, tu peux utiliser la commade:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    inquire(file=<...>,exist=ex)
    où tu met le nom du fichier que tu veux et ex est un logical... cela permet de savoir s'il existe ou pas...
    ensuite dans la fonction opem il y a le paramètre iostat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    open(unit=a,file=<...>,status=...,iostat=ios)
    où ios est un entier qui revoie à un code d'érreur
    de même il est utilise par read et write... tant qu'il est à 0, il n'y a pas de problèmes...

    Pour le return, je ne sais pas comment on le gère, dans mon petit cours de fortran 95, il est dit que le return multiple est un aspect obsolète...
    il n'y a que ceux qui savent qui ne savent pas qu'ils savent...
    Libere-toi hacker, GNU's Not Unix!!!

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juin 2002
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 37
    Points : 29
    Points
    29
    Par défaut
    Ouaip, tu as raison, les return multiples sont obsolètes (mais faut voir que ça paraissait un peu particulier comme truc.. bref).

    Et tu as raison aussi pour le call, j'suis pas sûr qu'on puisse lire une valeur de retour de toute façon. Ce qui réduit mes possibilités et le choix parait plus simple. Donc je penche pour en faire une fonction. De ce qui ressort de mes discussions avec mes collègues, c'est ce qui parait le mieux finalement. M'enfin si vous avez d'autres idées, n'hésitez pas

    Et merci au fait !

  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
    Effectivement, les alternates return sont obsolètes. Reste donc les solutions function value et paramètres additionnelles. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    integer function MaFonction(...)
       ...
       if(condition d'erreur 1)then
          MaFonction = 1
          return
       endif
       ...
    end function
     
    subroutine MaRoutine(...,CodeErreur)
       ...
       integer, intent(out) :: CodeErreur
       ...
       if(condition d'erreur 1)then
          CodeErreur = 1
          return
       endif
       ...
    end subroutine
    ...
    program ...
       ...
       CodeErreur = MaFonction(...)
       if (CodeErreur ...)
       ...
       call MaRoutine(...,CodeErreur)
       if (CodeErreur ...)
       ...
    end program
    Les 2 solutions semblent équivalentes. Les puristes te diront que la solution function value, ce n'est pas du Fortran ! En Fortran, une fonction retourne le résultat logique ou naturel de l'opération (au sens mathématique). Retourner un statut d'erreur par la fonction, c'est du C (ou ces dérivés).

    Personnellement, ayant fait du C il y a quelques années, j'ai beaucoup utilisé la solution function value. J'utilise maintenant surtout la solution paramètre additionnel, que je trouve finalement plus intuitive, plus auto-documentée. Je l'utilise beaucoup dans des modules en publiant également des paramètres symboliques de valeur d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    module UnModule
       ...
       integer, parameter :: OK = 1 !=> Tout s'est bien passé !
       integer, parameter :: File_Not_Found = 2 !=> Le fichier est introuvable !
       integer, parameter :: Data_corrupted = 3 !=> Les données du fichier ne sont pas cohérentes avec ce qui est attendu.
       ...
    contains
     
    subroutine MaRoutine(...,CodeErreur)
       ...
       integer, intent(out) :: CodeErreur
       ...
       if(condition d'erreur 2)then
          CodeErreur = File_Not_Found
          return
       endif
       ...
    end subroutine
    end module
    ...
    program ...
       ...
       call MaRoutine(...,CodeErreur)
       if (CodeErreur /= OK) then
       ...
    end program

  5. #5
    Nouveau membre du Club
    Inscrit en
    Juin 2002
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 37
    Points : 29
    Points
    29
    Par défaut
    Merci de ta réponse !

    En effet, ça correspond à ce que je suis en train de faire.
    En fait, après réflexion et au vu de ton message, je pense m'orienter finalement vers la solution de l'argument additionnel. J'hésite même à créer une structure 'Erreur' avec un code et un message explicatif par ex. Mais ça obligerait tous mes modules à implémenter cette structure. Ou bien à ce que chacun de mes modules soit associé à un module contenant ma définition de la structure Erreur. Et ça, ça me pose problème. Bon, si déjà je peux retourner un code retour, ça résoudra 80% de mon problème.

    Merci à vous !

    Je mets un résolu.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 07/10/2009, 15h32
  2. [PowerBuilder 8.0] Code retour d'une application PowerBuilder
    Par mamid1706 dans le forum Powerbuilder
    Réponses: 2
    Dernier message: 11/02/2008, 18h50
  3. [MySQL] Insertion de code HTML dans une table, avec UPDATE
    Par Daedalus31 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 05/02/2007, 12h19
  4. Réponses: 4
    Dernier message: 13/10/2005, 14h44
  5. Récupérer le code HTML d'une page avec Delphi 7
    Par PsyKroPack dans le forum Web & réseau
    Réponses: 5
    Dernier message: 06/02/2003, 21h56

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