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 :

Différence entre utiliser une fonction et une subroutine


Sujet :

Fortran

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 47
    Points : 29
    Points
    29
    Par défaut Différence entre utiliser une fonction et une subroutine
    Bonjour,

    Je débute en fortran, et je voulais savoir quelle est la principale différence entre utiliser une fonction et une subroutine ?
    Avez-vous des exemples de codes qui utilisent cela ?

    Pour retourner une valeur dans une fonction, il faut écrire return resultat ?

    Merci de vos réponses.

  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 : 41
    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
    Salut

    Je vais te donner les idées principales, mais un petit détour sur un cour sera nécessaire.

    La différence majeure entre une fonction et une subroutine, c'est qu'une fonction renvoie UNE seule donnée, tandis qu'une subroutine renvoie autant de données que tu veux ou rien du tout si tu veux.

    Par exemple tu prend la fonction f(x) = a*x + b, tu peux faire une fonction pour programmer le calcul de f(x) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    FUNCTION f(a,b,x)
    implicit none
    real,intent(in)::a,b,x
    real::f     ! dans un fonction son nom est déclaré
     
    f = a*x + b ! quelque part dans la fonction tu dois assigner qques chose à f
     
    END FUNCTION f
    Un exemple de subroutine, lire les paramètres a et b de ta fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SUBROUTINE lec(a,b)
    implicit none
    real,intent(out)::a,b
     
    write(*,*)"entrer a et b"
    read(*,*)a,b
    write(*,*)"a = ",a
    write(*,*)"b = ",b
     
    END SUBROUTINE lec
    Maintenant en se qui concerne l'appel dans un programme principal :

    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
     
    PROGRAM test
    implicit none
    integer::i
    real::f    ! la fonction doit être déclarée
    real::a,b,x
     
    ! on commence par lire les parametres
    call lec(a,b)
     
    !on calcule ensuite la fonction
    x = 0.0
    Do i=1,100
        x = x + 0.1 
        write(*,*)x,f(a,b,x)
    Enddo
     
    END PROGRAM test
    Voilà pour les aspects généraux, pour le détails tu devrais lire un cours sur les sous programmes, tu as des cours disponibles sur développez.com ici

  3. #3
    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
    la différence majeur est dans leur utilisation: comme l'a dit ladgalen, une subroutine est appelé via l'instruction call alors qu'une fonction peut être utilisé dans une expression.

    je ne suis pas d'accord avec le fait qu'une fonction ne renvoie qu'UNE seule donnée, d'une part car la fonction peut renvoyer un tableau de donnée, et d'autre part, certain résultats peuvent être mis dans les paramètres (comme pour une subroutine).

    on peut parfaitement faire une déclaration de fonction comme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    FUNCTION f(a,b,x)
    implicit none
    real(kind=8),intent(in)::x
    real(kind=8),intent(inout),dimension(:)::a,b
    real(kind=8),dimenssion(size(a))::f     ! dans un fonction son nom est déclaré
     
    f = a*x + b ! quelque part dans la fonction tu dois assigner qques chose à f
    a=f*b
    b=0.d0
     
    return
    END FUNCTION f
    et c'est tout à fait correct, tu as le droit de modifier les paramètres pendant la fonction à condition d'avoir déclarer le bon intent (in, out, inout)

    même s'il n'est pas nécéssaire, je conseil de mettre le return en fin de programme cela évite des erreurs quand on change de compilo par exemple...

    de plus, le return force la fin de la fonction: exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (x>0) then
       ...
    else
      return
    end if
    dans ce cas, la fonction s'arrête immédiatement si x est négatif....

  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 : 41
    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
    Je suis d'accord que le terme de donnée est un peu limitatif et que l'on peut également calculer des tableau matrices ect avec une fonction. Peut être que variable serait plus correct ....

    Le coup de modifier les paramètres je suis d'accord aussi, mais tu es sur que dans le programme principal tu récupères les paramètres modifiés ?

    Est ce que d'un point de vue programmation ce n'est pas plus correct d'utiliser une subroutine si tu veux modifier plusieurs paramètres en même temps ?

  5. #5
    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
    il est de coutume d'utiliser une subroutine en effet...

    mais par exemple, j'utilise un algo de méca flux qui a en paramètre les vitesses (u,v) et la pression P pour me donner la matrice du système linéaire à résoudre (en fait y a autant de fonction que d'équation) mais on peut autorisé la modification de u et v (pour un algo adaptatif...)

    ou bien tout simplement tu utilise une fonction exactement comme une subroutine (donc avec modification des tableau) et le résultat de la fonction est un entier qui renvoie un code d'erreur par exemple...

    de plus, dans le prog principal, biensûr que tu récupère les valeurs exactement comme quand tu utilise une subroutine (à condition que tu ai le droit d'écrire dans la variable). on peut imaginé une subroutine qui appelle la fonction, il faut alors vérifier que les intent soient compatible sinon, tu aura des erreurs (mais le compilo vérifie cela!!!)

    après, il y a la notion du "correct" qui dépend fortement de ce que tu veux faire...

  6. #6
    Débutant
    Inscrit en
    Juillet 2007
    Messages
    386
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 386
    Points : 119
    Points
    119
    Par défaut
    J ajoutes aussi une des differences entre function et subroutine c est que le resultat que tu cherche se trouve dans l argument de la subroutine tandisque dans la fonction non!
    par exemple, suppose que tu cherche a approché une intégrale numeriquement, tu peut ecrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      subroutine integrale(a,b,T) ! a et b sont les bornes de l integrale et T le résultat
    ensuite dans ton programe tu écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       call integrale(1,2,F)
                   print*,'integrale=',F ! Ton F est le résultat
    tandisque si tu veut utiliser une fonction , tu peut ecrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      function integrale(a,b) ! remarque que tu n as pas ton résultat en argument
    puis tu écrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       F=integrale(1,2)
                   print*,'integrale=',F

Discussions similaires

  1. Appel d'une fonction dans une fonction d'une même classe
    Par script73 dans le forum Général Python
    Réponses: 3
    Dernier message: 06/03/2015, 10h18
  2. Comment utiliser une fonction dans une fonction
    Par hatenaku dans le forum Langage
    Réponses: 3
    Dernier message: 19/04/2008, 20h00
  3. comment utiliser un programme comme une fonction dans une macro exel
    Par ERICKO dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 04/10/2007, 23h39
  4. Réponses: 3
    Dernier message: 29/04/2006, 13h02
  5. Réponses: 4
    Dernier message: 17/03/2004, 17h24

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