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 95] Appel d'une fonction à partir d'une fonction


Sujet :

Fortran

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 25
    Points : 18
    Points
    18
    Par défaut [Fortran 95] Appel d'une fonction à partir d'une fonction
    Bonjour,

    Je voudrais pouvoir appeler la fonction B() à partir de A() de cette manière:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    COMPLEX FUNCTION A()
        ....
     
        A = B()
    END FUNCTION A
    Seulement j'ai une erreur de ce type:
    projet2.f95:125.20:

    A = B()
    1
    Error: Function 'a' at (1) has no IMPLICIT type
    D'où cela pourrait venir ?

    Merci d'avance.

  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
    Tu dois fournir le type de la fonction B lors de la compilation de A. Il y a plusieurs façons :
    • Tu ajoute une ligne genre integer B (ou real B ou complex B ou ...) dans A pour déclarer le type de B
    • Tu fais une interface (Fortran 90) à B dans A
    • Tu place B dans un module et tu « use » le module dans A

  3. #3
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 25
    Points : 18
    Points
    18
    Par défaut
    Merci ça fonctionne bien en déclarant le type de la fonction.

    J'ai encore quelques points obscures concerant le langage.

    Que faut-il exactement mettre dans la section "interface" du programme ? Par exemple, ma fonction A est dedans, mais j'ai remarqué que si je mettais COMPLEX, EXTERNAL :: B avant interface (et pas dedans) ça fonctionnait, pourquoi ?

    De plus, pourquoi ne doit-on pas déclarer les subroutines dans INTERFACE (et nul part ailleurs) ?

    Je voudrais aussi savoir quelle est l'utilité de INTENT(IN) exactement?

    Et enfin, comment puis-je afficher sur une même ligne des variables qui sont modifiées dans un boucle DO WHILE END DO ? et sans avoir pleins d'espaces entre les variables

    Merci beaucoup et désolé si je dérive un peu du sujet principal.

  4. #4
    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
    Citation Envoyé par herlock Voir le message
    Que faut-il exactement mettre dans la section "interface" du programme ? Par exemple, ma fonction A est dedans, mais j'ai remarqué que si je mettais COMPLEX, EXTERNAL :: B avant interface (et pas dedans) ça fonctionnait, pourquoi ?
    Ce n'est pas l'interface du programme, il faut (enfin, il est preferable de) declarer une interface pour chaque fonction et sous-routine utilisees. Ainsi le compilateur peut verifier que l'appel a ces fonctions et sous-routines est correct (nombre d'arguments, leurs types, leurs dimensions, ...) [Si tu connais le C, les interfaces remplissent au role equivalent aux prototypes dans ce langage].

    de plus, pourquoi ne doit-on pas déclarer les subroutines dans INTERFACE (et nul part ailleurs) ?
    Cette regle est fausse.

    Je voudrais aussi savoir quelle est l'utilité de INTENT(IN) exactement?
    Cela indique que l'argument ne sera pas modifie par la routine ou fonction (i.e. il ne sera present que du cote droit d'une expression). Sachant cela, le compilateur peut faire des optimisations supplementaires.

    Et enfin, comment puis-je afficher sur une même ligne des variables qui sont modifiées dans un boucle DO WHILE END DO ? et sans avoir pleins d'espaces entre les variables
    Il faut donner un format explicite a ton WRITE() ou PRINT, plutot que d'utiliser le formatage automatique *. Plus d'informations dans ton livre de Fortran prefere ou sur le reseau (par exemple ici).

  5. #5
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 25
    Points : 18
    Points
    18
    Par défaut
    Un tout grand merci !

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/03/2010, 15h43
  2. [Batch] Créer une chaine à partir d'une variable et d'une autre chaine
    Par mlle lain dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 10/11/2009, 16h26
  3. Saisir une image à partir d'une photo ou d'une vidéo
    Par lohengrin56 dans le forum Flash/Flex
    Réponses: 0
    Dernier message: 07/07/2009, 16h17
  4. Réponses: 2
    Dernier message: 05/01/2009, 12h45
  5. Réponses: 5
    Dernier message: 22/05/2008, 14h42

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