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 :

Fonction en argument d'une autre fonction


Sujet :

Fortran

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 135
    Points : 44
    Points
    44
    Par défaut Fonction en argument d'une autre fonction
    Salut,


    Je sais que pour déclarer une fonction qui va être appelé en argumentd'autre autre fonction on utilise EXTERNAL.
    Par contre si cette fonction retourne un tableau, j'ai un peu de mal a la passer en argument car il me dit l'attribut EXTERNAL et DIMENSION sont en conflit.

    J'utilise dans mon code ci dessous une fonction retournant un tableau que je veux appeler dans en argument de ma subroutine.
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    FUNCTION carre(vect)
    	IMPLICIT NONE
     
    	REAL, DIMENSION (:) :: vect
    	REAL, DIMENSION(SIZE(vect)) :: carre
    	INTEGER :: i
     
     
    		DO i = 1,SIZE(vect)
    			carre(i) = vect(i) * vect(i)
    		END DO
     
     
    END FUNCTION carre
     
    PROGRAM vecteur
    	IMPLICIT NONE
     
     
    	REAL,DIMENSION(5) :: vect,resu
    	INTEGER :: i,n
     
    	INTERFACE 
    		FUNCTION carre(vect)
     
    			REAL, DIMENSION (:) :: vect
    			REAL, DIMENSION(SIZE(vect)) :: carre
    			INTEGER :: i
     
    		END FUNCTION carre
    	END INTERFACE
     
    	EXTERNAL carre
     
     
     
    	n = 5;
    	!initialisation du vecteur aléatoirement
    	DO i = 1,n
    		vect(i) = REAL(rand(0)*45)+1 
    	END DO
     
    	!affichage de celui-ci
    	DO i = 1,n
    		WRITE(6,*) 'vect(',i,') = ',vect(i) 
    	END DO
     
    !!      resu = carre(vect);
    	CALL select_transfo(vect,carre)
     
    	DO i = 1,n
    		WRITE(6,*) 'vect(',i,') = ',resu(i) 		
    	END DO
     
     
    	CONTAINS
     
                     ! la subroutine qui va appeler la fonction carre en argument
    		SUBROUTINE select_transfo(vect,fonct)
     
     
    			REAL, DIMENSION (:) :: vect
    			REAL, DIMENSION (:) :: fonct
     
    			vect = carre(vect);
     
     
    		END SUBROUTINE select_transfo
     
    END PROGRAM vecteur
    Merci

  2. #2
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Points : 5 179
    Points
    5 179
    Par défaut
    Salut !

    Fais une subroutine plutôt qu'une fonction.

    Jean-Marc Blanc
    Calcul numérique de processus industriels
    Formation, conseil, développement

    Point n'est besoin d'espérer pour entreprendre, ni de réussir pour persévérer. (Guillaume le Taiseux)

  3. #3
    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 FR119492 Voir le message
    Fais une subroutine plutôt qu'une fonction.
    Non, une fonction est tout a fait adaptee dans une telle situation. Elle prend un vecteur et renvoit un vecteur, c'est tres propre.

    bonjour69: Le truc, c'est que select_transfo() doit aussi connaitre l'interface de la fonction qu'elle va appeler. Autres erreurs dans ton code:
    • Enleve le external dans ta routine principale (on ne peut pas avoir a la fois un external et une interface d'une meme fonction ou routine)
    • select_transfo() appelle fonct() et pas carre() puisqu'elle ne sait rien de carre()
    • Il faut afficher le contenu de vect et pas de resu apres l'appel a select_transfo()
    • i n'a rien a faire dans l'interface de carre puisque c'est une variable locale (qui n'est d'ailleurs pas necessaire)


    Corrige et re-arrange, ton code devient:
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    function carre(vect)
      implicit none
     
      real, dimension (:) :: vect
      real, dimension(size(vect)) :: carre
     
      carre = vect * vect
     
    end function carre
     
    program vecteur
      implicit none
     
      integer, parameter :: n = 5
      real, dimension(n) :: vect
      integer :: i
     
      interface 
        function carre(vect)
          real, dimension (:) :: vect
          real, dimension(size(vect)) :: carre		
        end function carre
      end interface
     
      ! initialisation du vecteur
      do i = 1, n
        vect(i) = real(i)
      end do
     
      ! affichage de celui-ci
      do i = 1, n
        write(6, *) 'vect(',i,') = ', vect(i) 
      end do
     
      call select_transfo(vect, carre)
     
      do i = 1, n
        write(6,*) 'vect(',i,') = ', vect(i) 		
      end do
     
      contains
     
        ! la subroutine qui va appeler la fonction carre en argument
        subroutine select_transfo(vect, fonct)
     
        real, dimension (:) :: vect
        interface
          function fonct(array)
            real, dimension(:) :: array
            real, dimension(size(array)) :: fonct
          end function fonct
        end interface
     
        vect = fonct(vect)
     
      end subroutine select_transfo
     
    end program vecteur

Discussions similaires

  1. Résultat d'une fonction en argument d'une autre fonction.
    Par xess91 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 15/04/2009, 15h15
  2. [scipy] Séries mathématiques - fonction comme argument d'une autre
    Par sebsainte dans le forum Calcul scientifique
    Réponses: 6
    Dernier message: 20/09/2007, 00h59
  3. Fonction argument d'une autre Fonction
    Par didyeah dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 21/05/2007, 15h10
  4. entrer une fonction en argument d'une autre fonction
    Par arno78 dans le forum VB 6 et antérieur
    Réponses: 22
    Dernier message: 07/09/2006, 14h29
  5. Réponses: 3
    Dernier message: 16/06/2004, 11h26

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