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 :

erreur de déclaration


Sujet :

Fortran

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 35
    Par défaut erreur de déclaration
    Bonsoir,
    j'ai écrit un programme qui calcule la double intégrale de la fonction f(x,y)=x*y
    une erreur de déclaration apparait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Error: This name does not have a type, and must have an explicit type.   [F45]
             BN=F45(y,YA)+F45(y,YB)
    malgré que F45 est bel et bien déclarée comme une fonction.

    voici le code du programme:

    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
    implicit none
          double precision X,Z,Y,AA,B,H,AN,AE,AO,YA,YB,HX,BN,BE
    	double precision BO,A1,AC,C,D
    	integer N1,M1,I1,J2,MM,NN
    	External F45
     
     
                !two positive integers N1, M1. There will be 2M subintervals for the  !outer integral and 2N subintervals for the inner integral 
     
     
    !lower limit of integration AA and upper limit of integration separated B    
            AA=0
    	b=5
     
    	N1=1000
    	M1=1000
       	NN=2*N1+1
          MM=2*M1-1
          H=(B-AA)/(2*N1)
          AN=0
          AE=0
          AO=0
          DO I1=1,NN
             y=AA+(I1-1)*H
             YA = y
             yB=2
             HX=(YB-YA)/(2*M1)
             BN=F45(y,YA)+F45(y,YB)
     
             BE=0
             BO=0
             DO J2=1.0,MM
     
                x=YA+(J2-1)*HX
                Z=F45(y,xx)
                IF(J2.EQ.2*(J2/2.0)) THEN
                   BE=BE+Z
                ELSE
                   BO=BO+Z
                END IF
    		end do
          A1=(BN+2*BE+4*BO)*HX/3.0
          IF( I1.EQ.1 .OR. I1.EQ.NN ) THEN
             AN=AN+A1
          ELSE
             IF(I1.EQ.2*(I1/2)) THEN
                 AO=AO+A1
             ELSE
                 AE=AE+A1
             END IF
          END IF
    	 end do
     
          AC=(AN+2*AE+4*AO)*H/3
          Print*, AC
    	end
    !	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    !	Fonction à intégrer
     
    		DOUBLE PRECISION  FUNCTION F45(y,x)
    		implicit none
    	double precision x,y
     
          F45=x*y
     
     		RETURN
    		END
    Aidez moi svp
    merci

  2. #2
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    cela fait tres longtemps que je n'ai pas fait de fortran (8 ans)

    mais respecte tu biens les contraints pour External?

    8.7 EXTERNAL Statement
    An EXTERNAL statement is used to identify a symbolic name as representing an external procedure or dummy procedure, and to permit such a name to be used as an actual argument.
    The form of an EXTERNAL statement is:

    EXTERNAL proc [,proc]...
    where each proc is the name of an external procedure, dummy procedure, or block data subprogram. Appearance of a name in an EXTERNAL statement declares that name to be an external procedure name or dummy procedure name, or block data subprogram name. If an external procedure na`)me or a dummy procedure name is used as an actual argument in a program unit, it must appear in an EXTERNAL statement in that program unit. Note that a statement function name must not appear in an EXTERNAL statement.
    If an intrinsic function name appears in an EXTERNAL statement in a program unit, that name becomes the name of some external procedure and an intrinsic function of the same name is not available for reference in the program unit.

    Only one appearance of a symbolic name in all of the EXTERNAL statements of a program unit is permitted.

  3. #3
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    visiblement external est utiliser pour des procedures, pas des fonctions.
    je viens de dire une connerie...

    regarde vers 15.5
    http://www.fortran.com/F77_std/rjcnf...-15.html#sh-15


    as tu déclaré F45 de cette façon?

    double precision FUNCTION F45 (x,y)

  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
    Par défaut
    Le problème n'est pas sur la nature « fonction » de F45, mais sur le type (relis bien le message d'erreur). C'est que le compilateur ne sait pas si F45 retourne un entier, un réel, un double, un logique, ... Les deux « unit » (le programme et la fonction) sont dans deux « scoping unit » différents. Le compilateur compile un « scoping unit » à la fois, de façon indépendante.

    Il faut donc que tu indiques « double precision F45 » en plus de « external F45 » dans le programme principal.

    De plus, si ton compilateur supporte la norme Fortran 90 (au moins), il serait plus simple de mettre ta fonction comme fonction interne du programme principal. Pour faire cela, tu dois :
    • enlever la ligne external
    • ne pas ajouter la ligne double precision F45
    • changer le premier « end » (celui juste avant la fonction) pour « contains »

    Avantages :
    • les deux « unit » étant dans le même « scoping unit », le compilateur peut faire beaucoup plus de validation puisqu'il voit les 2 lorsqu'il les compile.
    • Tu as moins de choses à déclarer

  5. #5
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 35
    Par défaut
    bonjour,
    merci bcp pour la réponse

  6. #6
    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
    Par défaut
    Dans ma recette pour mettre la fonction interne, j'avais fait quelques omissions. Voici donc le code corrigé, avec des « par SB » pour identifier les modifications que j'ai fait :
    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
    implicit none
          double precision X,Z,Y,AA,B,H,AN,AE,AO,YA,YB,HX,BN,BE
    	double precision BO,A1,AC,C,D
    	integer N1,M1,I1,J2,MM,NN
    !	External F45 enleve par SB
     
     
                !two positive integers N1, M1. There will be 2M subintervals for the  !outer integral and 2N subintervals for the inner integral 
     
     
    !lower limit of integration AA and upper limit of integration separated B    
            AA=0
    	b=5
     
    	N1=1000
    	M1=1000
       	NN=2*N1+1
          MM=2*M1-1
          H=(B-AA)/(2*N1)
          AN=0
          AE=0
          AO=0
          DO I1=1,NN
             y=AA+(I1-1)*H
             YA = y
             yB=2
             HX=(YB-YA)/(2*M1)
             BN=F45(y,YA)+F45(y,YB)
     
             BE=0
             BO=0
             DO J2=1.0,MM
     
                x=YA+(J2-1)*HX
                Z=F45(y,x)
                IF(J2.EQ.2*(J2/2.0)) THEN
                   BE=BE+Z
                ELSE
                   BO=BO+Z
                END IF
    		end do
          A1=(BN+2*BE+4*BO)*HX/3.0
          IF( I1.EQ.1 .OR. I1.EQ.NN ) THEN
             AN=AN+A1
          ELSE
             IF(I1.EQ.2*(I1/2)) THEN
                 AO=AO+A1
             ELSE
                 AE=AE+A1
             END IF
          END IF
    	 end do
     
          AC=(AN+2*AE+4*AO)*H/3
          Print*, AC
    !	end enleve par SB
    contains ! ajoute par SB
    !	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    !	Fonction à intégrer
     
    		DOUBLE PRECISION  FUNCTION F45(y,x)
    		implicit none
    	double precision x,y
     
          F45=x*y
     
     		RETURN
    		END function ! function ajoute par SB
    end program ! ajoute par SB

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

Discussions similaires

  1. [EasyPHP] erreur de déclaration
    Par Zen_Fou dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 5
    Dernier message: 07/04/2006, 17h59
  2. Erreur sur déclaration de liste
    Par La Truffe dans le forum C++
    Réponses: 4
    Dernier message: 19/02/2006, 19h38
  3. Réponses: 16
    Dernier message: 19/11/2005, 16h47
  4. Servlet erreur de déclaration dans le web.xml
    Par mlequim dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 15/11/2005, 11h28
  5. Réponses: 2
    Dernier message: 27/05/2002, 19h46

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