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 :

probleme avec le CALL


Sujet :

Fortran

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 14
    Par défaut probleme avec le CALL
    J'ai un probleme que je n'arrive pas a resoudre depuis quelques heures maintenant.

    J'ai un programme qui appelle une subroutine et l'erreur a la compilation est la suivante:

    erreur 260 : this subroutine has the wrong number of arguments or arguments with the wrong name, type or rank.
    Meme si la description de l'erreur semble precise je ne comprends pas car j'ai verifie tout cela et il y a le bon nombre d'arguments, les noms sont correctes ainsi que le type. Je ne sais pas trop ce qu'est le rank mais si c'est la dimension de mes vecteurs et matrices, ca colle aussi.

    Voici le 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
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    PROGRAM progRHS
     
          IMPLICIT NONE
    !     EXTERNAL upwdRHS
          INTEGER :: nx,ny,lsize,MS1N,nxnylsize,erreur
     
          INTEGER::ind1,ind2,ind3,ind4,ind5,ind6,ind7,ind8,ind9,ind10
          REAL, ALLOCATABLE, dimension ( : ) :: Cin,Cout,Cp0,Cix,Cfx,Ciy,Cfy
          REAL, ALLOCATABLE, dimension ( : , : , : ) :: N0L,NpL,NmL2
          REAL, ALLOCATABLE, dimension ( : , : , : ) :: M0L,MpL,MmL
          REAL, ALLOCATABLE, dimension ( : , : , : , : ) :: Cp00
     
          INTEGER :: ix,iy,ix0,iy0,iiyp,iiym,iixp,iixm
          INTEGER, ALLOCATABLE, dimension( : ) :: maskMx,maskPx,tabMx,tabPx
          INTEGER, ALLOCATABLE, dimension( : ) :: maskMy,maskPy,tabMy,tabPy
     
          interface
     
                SUBROUTINE upwdRHS(Cin, Cp00, NpL, NmL2, MpL, MmL, Cout)
     
                    INTEGER :: ix,iy,ix0,iy0,iiyp,iiym,iixp,iixm
                    REAL, dimension ( : ) :: Cp0,Cix,Cfx,Ciy,Cfy
                    INTEGER :: ind1,ind2,ind3,ind4,ind5,ind6,ind7,ind8,ind9,ind10
     
                END SUBROUTINE UPWDRHS
          END interface      
     
     
          nx=3
          ny=3
          MS1N=4
          lsize=2*2*MS1N
          nxnylsize=nx*ny*lsize
     
          ALLOCATE(Cin(nxnylsize),STAT=erreur)
          ALLOCATE(N0L(lsize,lsize,nx),STAT=erreur)
          ALLOCATE(NpL(lsize,lsize,nx),STAT=erreur)        
          ALLOCATE(NmL2(lsize,lsize,nx),STAT=erreur)
          ALLOCATE(M0L(lsize,lsize,ny),STAT=erreur)
          ALLOCATE(MpL(lsize,lsize,ny),STAT=erreur)
          ALLOCATE(MmL(lsize,lsize,ny),STAT=erreur)
     
          ALLOCATE(maskMx(nx),STAT=erreur)
          ALLOCATE(maskPx(nx),STAT=erreur)
          ALLOCATE(maskMy(ny),STAT=erreur)
          ALLOCATE(maskPy(ny),STAT=erreur)
          ALLOCATE(tabMx(nx),STAT=erreur)
          ALLOCATE(tabPx(nx),STAT=erreur)
          ALLOCATE(tabMy(ny),STAT=erreur)
          ALLOCATE(tabPy(ny),STAT=erreur)
     
          ALLOCATE(Cp0(lsize),STAT=erreur)
          ALLOCATE(Cix(lsize),STAT=erreur)
          ALLOCATE(Cfx(lsize),STAT=erreur)
          ALLOCATE(Ciy(lsize),STAT=erreur)
          ALLOCATE(Cfy(lsize),STAT=erreur)
     
          ALLOCATE(Cp00(lsize,lsize,nx,ny),STAT=erreur)
     
          Cin=2
          N0L( : , : , : ) =3
          M0L( : , : , : ) =3
          NmL2( : , : , : ) =5
          NpL( : , : , : ) =10
          MmL( : , : , : ) =50
          MpL( : , : , : ) =100
     
          ALLOCATE(Cout(nxnylsize),STAT=erreur)
     
          DO ix=1,nx
         tabMx(ix)=ix-1
         tabPx(ix)=ix+1
          ENDDO
     
          DO ix=1,nx
             maskMx(ix)= max(tabMx(2),tabMx(ix))
             maskPx(ix)= min(tabPx(nx),tabPx(ix))
          ENDDO
     
          DO iy=1,ny
         tabMy(iy)=iy-1
             tabPy(iy)=iy+1
          ENDDO
     
          DO iy=1,ny
         maskMy(iy)= max(tabMy(2),tabMy(iy))
         maskPy(iy)= min(tabPy(ny),tabPy(iy))
          ENDDO
     
          DO iy=1,ny
          DO ix=1,nx
                 Cp00(:,:,ix,iy)=M0L(:,:,iy)+N0L(:,:,ix)
          ENDDO
          ENDDO
     
     
          CALL upwdRHS(Cin, Cp00, NpL, NmL2, MpL, MmL, Cout)
     
          DEALLOCATE(Cin,Cout,N0L,M0L,NpL,NmL2,MpL,MmL)
          DEALLOCATE(maskMx,maskPx,maskMy,maskPy,Cp00)
          DEALLOCATE(Cp0,Cix,Cfx,Ciy,Cfy,tabMx,tabPx,tabMy,tabPy)
     
          STOP
          END PROGRAM progRHS
    Et voici la 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
    SUBROUTINE  upwdRHS(Cin, Cp00, NpL, NmL2, MpL, MmL, Cout)
          IMPLICIT NONE
     
          INTEGER :: ix,iy,ix0,iy0,iiyp,iiym,iixp,iixm
     
          REAL, dimension( : ) :: Cp0,Cix,Cfx,Ciy,Cfy
          INTEGER :: ind1,ind2,ind3,ind4,ind5,ind6,ind7,ind8,ind9,ind10
     
          DO iy = 1,ny
             iy0   = (iy -1)*lsize*nx
         iiyp  = (maskPy(iy)-1)*lsize*nx
             iiym  = (maskMy(iy)-1)*lsize*nx
     
         DO ix = 1,nx
            ix0   = (ix -1)*lsize
                iixp  = (maskPx(ix)-1)*lsize
            iixm  = (maskMx(ix)-1)*lsize              
     
     
                ind1 = ix0 + iy0 + 1
            ind2 = ind1 + lsize - 1
                Cp0 = MATMUL(Cp00(:,:,ix,iy),Cin(ind1:ind2))
     
                ind3 = iixm + iy0 + 1
                ind4 = ind3 + lsize    - 1
                Cix = MATMUL(NmL2(:,:,ix),Cin(ind3:ind4))
     
                ind5 = iixp + iy0 + 1
                ind6 = ind5 + lsize - 1
                Cfx = MATMUL(NpL(:,:,ix), Cin(ind5:ind6))
     
                ind7 = ix0 + iiym + 1
                ind8 = ind7 + lsize - 1
                Ciy = MATMUL(MmL(:,:,iy),Cin(ind7:ind8))
     
                ind9 = ix0 + iiyp + 1
                ind10 = ind9 + lsize - 1
                Cfy = MATMUL(MpL(:,:,iy),Cin(ind9:ind10))
     
            Cout(ind1:ind2)=Cp0+Cfx+Cix+Cfy+Ciy
     
                print*,Cout
     
          ENDDO               
          ENDDO                   
     
          RETURN
     
          END SUBROUTINE upwdRHS
    Je vous remercie d'avance pour votre aide.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Août 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 14
    Par défaut
    Bonjour,

    ...merci a Hédhili Jaïdane pour les balises sur le post je ne savais pas comment il fallait faire...

    Edit : Bienvenue sur le forum - Aide sur l'utilisation des boutons



  3. #3
    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
    Ta routine ne devrait pas compiler non plus. En Fortran, comme dans la grande majorité des langages compilés, le type des arguments d'une routine ou d'une fonction n'est pas hérité du programme appelant. Le type de chacun des arguments doit être indiqué localement. Ainsi, le début de ta routine devrait avoir l'air de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SUBROUTINE  upwdRHS(Cin, Cp00, NpL, NmL2, MpL, MmL, Cout)
          IMPLICIT NONE
          real, dimension(:), intent(....) :: Cin
          real, dimension(:.........         :: Cp00
          ...
    Et c'est cette partie des déclarations qui devrait se trouver dans l'interface, pas la déclaration des variables locales.

    Un bloc interface est logiquement isolé du programme dans lequel il se trouve. L'interface n'a donc pas accès à la déclaration des variables du programme dans lequel il se trouve. Même l'implicit none de l'appelant n'est pas visible. Comme ton interface ne déclare aucune des variables « dummy », elles sont toutes déclarées implicit real ou implicit integer selon la règle de la première lettre (et scalaire). D'où le message d'erreur.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Août 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 14
    Par défaut
    Merci beaucoup Sylvain Bergeron, j'avais presque perdu espoir qu'on me reponde, lol.

    Je vais voir cela de plus pres et je tiendrai le forum au courant de mon avancee.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 14
    Par défaut
    Bonjour,

    Je n'ai plus touché à ce code en fait mais, Sylvain Bergeron avait raison. J'ai fait les modif et je n'ai plus cette erreur.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 05/12/2007, 18h20
  2. Probleme avec la copie des surfaces
    Par Black_Daimond dans le forum DirectX
    Réponses: 3
    Dernier message: 09/01/2003, 10h33
  3. probleme avec la touche F10
    Par b.grellee dans le forum Langage
    Réponses: 2
    Dernier message: 15/09/2002, 22h04
  4. Probleme avec fseek
    Par Bjorn dans le forum C
    Réponses: 5
    Dernier message: 04/08/2002, 07h17
  5. [Kylix] probleme avec un imagelist
    Par NicoLinux dans le forum EDI
    Réponses: 4
    Dernier message: 08/06/2002, 23h06

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