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 :

[Débutant] Passage d'arguments à l'exécutable comme pour le C ?


Sujet :

Fortran

  1. #1
    Membre à l'essai
    Inscrit en
    Août 2008
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 19
    Points : 22
    Points
    22
    Par défaut [Débutant] Passage d'arguments à l'exécutable comme pour le C ?
    Bonjour !
    Je viens de parcourir le manuel de débutant du fortran et je ne trouve nulle part la réponse pour ma question.
    J'essaye de passer des arguments à mon exécutable comme en C.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    main(int argc, char * argv)
    Donc, j'ai déclaré mon programme principal ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    program TOTO(arg1, arg2)
    Le compilo me dit rien mais quand j'exécute mon programme, aucune de ces syntaxes n'est bonne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ./TOTO arg1 arg2
    ./TOTO(arg1,arg2)
    Et quand j'essaye de déclarer mes arguments avec intent in :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    character(LEN=*) , intent(in) :: arg1
    Il me dit -je cite- "the intent attribute ... is not allowed in a PROGRAM unit[/code]

    Merci pour votre aide

  2. #2
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Le point d'entree du programme n'est pas une fonction en Fortran, au contraire du C. On ne peut donc pas recevoir d'arguments ainsi. Il faut appeler iargc() pour obtenir le nombre d'arguments, et getarg() pour obtenir la valeur de chacun des arguments. Certains compilateurs ne disposent pas de ces fonctions, cependant.

  3. #3
    Membre à l'essai
    Inscrit en
    Août 2008
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 19
    Points : 22
    Points
    22
    Par défaut
    Merci !
    Je suis vraiment débutant et grâce à ta réponse j'ai pu googliser getarg et trouver mon bonheur.
    Si y en a que ça intéresse, voici la solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
              PROGRAM test_getarg
                INTEGER :: i
                CHARACTER(len=32) :: arg
     
                DO i = 1, iargc()
                  CALL getarg(i, arg)
                  WRITE (*,*) arg
                END DO
              END PROGRAM

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    110
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 110
    Points : 130
    Points
    130
    Par défaut
    +1 Dazumba

    Ces subroutines ne sont pas portables...J'avais mis du temps à comprendre ca à une époque (et traiter des compilateurs de tous les noms d'oiseaux possibles )

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 488
    Points : 593
    Points
    593
    Par défaut
    Bonjour,

    En fait (si j'ai bien compris ce que j'ai lu de-ci de-là), ce n'est qu'avec la norme 2003 qu'ont été définies les fonctions et routines intrinsèques pour gérer les arguments de l'exécutable: la fonction command_argument_count() renvoie le nombre d'arguments (nom de l'exécutable exclu), la routine get_command(command,length,status) permet de récupérer tous les arguments d'un coup et la routine get_command_argument(i,argument,length,status) de récupérer le ième argument.

    Ce qui donnerait quelque chose comme
    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
     
    program test_get_command
     
    implicit none
    integer :: i
    character(len=200) :: argument
    integer :: length ! nb de caracteres de 'argument' (optionnel)
    integer :: status ! =0 si l'operation s'est bien deroulee (optionnel)
     
    do i=0,command_argument_count()
      call get_command_argument(i,argument,length,status)
      write(*,*) trim(argument)
    enddo
     
    end program test_get_command
    Mais il faut ensuite disposer d'un compilateur qui a intégré ces ajouts de la norme 2003 ...
    (je peux seulement affirmer qu'avec g95 ça passe).

  6. #6
    Membre à l'essai
    Inscrit en
    Août 2008
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 19
    Points : 22
    Points
    22
    Par défaut
    Pendant qu'on y est, j'espère ne pas abuser de votre gentilesse

    Les arguments sont récupérés en chaine de caractère.
    J'ai essayé de convertir un de ces arguments en integer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    character (LEN=150) :: arg
    character (LEN=150) :: toto
    integer :: a
    ...
    call getarg(1,toto)
    write(*,*)  toto
    call getarg(2,arg)
    write(*,*) arg           ! ça me donne le bon chiffre
     
    write (a,'(I1)') arg      ! Quand je fais trim(arg), segmentation fault
    write(*,*) arg           ! Me donne 0 comme résultat quelque soit le vrai chiffre
    Qu'est ce qui cloche ?
    Pourquoi quand j'affiche a, il n'a pas reçu la valeur de l'argument ?
    Merci !

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 117
    Points : 113
    Points
    113
    Par défaut
    Bonjour,

    on en parlait justement ce matin avec les collègues de boulot. si ton argument est stocké dans la chaine de caractères toto (donc toto vaut par exemple '6'), pour le récupérer en tant qu'integer, il suffit d'utiliser un READ :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    read (toto, '(i1)') mon_entier

  8. #8
    Membre à l'essai
    Inscrit en
    Août 2008
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 19
    Points : 22
    Points
    22
    Par défaut
    Bien joué : c'est ça !
    Pourtant, dans ma tête, j'étais sûr du write ...

    A bientôt pour de nouvelles aventures

  9. #9
    Membre habitué Avatar de Grame
    Profil pro
    Inscrit en
    Août 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Août 2007
    Messages : 148
    Points : 192
    Points
    192
    Par défaut
    Bonjour,

    Mais il faut ensuite disposer d'un compilateur qui a intégré ces ajouts de la norme 2003 ...
    (je peux seulement affirmer qu'avec g95 ça passe).
    C'est aussi inclus dans gfortran sous linux

  10. #10
    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
    en gros, "write" ne sort que des chaines de caractère, tandis que read traduit une chaine de caractère en variable entière/reel/complexe/character....

    de plus gfortran et g95 sont basés sur gcc... donc les fonction de récupérations des argument sont inclue car traduites en c...
    il n'y a que ceux qui savent qui ne savent pas qu'ils savent...
    Libere-toi hacker, GNU's Not Unix!!!

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 21/12/2009, 18h03
  2. [MVC] [Débutant] Passage d'argument sans formulaire
    Par relivio dans le forum Spring Web
    Réponses: 1
    Dernier message: 29/10/2009, 12h25
  3. Passage des arguments pour printf
    Par Missa dans le forum C
    Réponses: 8
    Dernier message: 01/09/2009, 13h40
  4. Transformer le Min au Maj en JAVASCRIPT et passage en argument pour un BEAN
    Par debutant01 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 03/08/2007, 14h00
  5. Port comm pour débutant
    Par carotreger dans le forum Débuter
    Réponses: 11
    Dernier message: 03/11/2005, 00h19

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