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 :

allocation de tableaux !


Sujet :

Fortran

Vue hybride

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

    Informations forums :
    Inscription : Septembre 2009
    Messages : 24
    Par défaut allocation de tableaux !
    Bonjour,

    j'ai le programme suivant dans lequel je manipule des tableaux, mais j'ai le message d'erreur suivant (entre autres) : "ligne 12 : allocatable array 'a' must have a deferred shape"...

    voici le code :

    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
    !     
    !     this program gives the linear (average) equation giving the acceleration
    !     as a function of the voltage :
    !     
    PROGRAM linearleast
      IMPLICIT NONE
      INTEGER            ::  i,j,nl,n
      REAL               ::  x,y
      ! 
      !     n is the number of rows in the data file
      !
      REAL,ALLOCATABLE,DIMENSION(n,2)   ::  A
      !
      !     A is the matrix in which the datas will be stored
      !
      !
      ! interface bloc :
      ! 
      INTERFACE
         SUBROUTINE coef(A,n,nl)
           INTEGER,INTENT(INOUT)            ::  nl
           REAL,INTENT(INOUT),ALLOCATABLE   ::  A(n,2)
         END SUBROUTINE coef
      END INTERFACE
      OPEN (33,FILE='xydata.dat',form='formatted',status='old')
      nl=0
    10 READ (33,*,END=20) x,y
      nl=nl+1
      GO TO 10
    20 REWIND (33)
      !     creation of the matrix A :
      ALLOCATE (A(n,2))
      DO i=1,nl
         READ (33,*) (A(i,j),j=1,2) 
      END DO
      CALL coef (A,n,nl)
      DEALLOCATE (A)
    END PROGRAM linearleast
    !     
    SUBROUTINE coef (D,m,nl)
      IMPLICIT NONE
      INTEGER          :: i,j,m,nl
      REAL             :: c,b,g,f,a,k,l
      REAL,ALLOCATABLE   :: D(m,2),E(nl),H(nl)
      !     c is the sum of the accelerations
      c=0
      ALLOCATE (D)
      DO i=1,nl
         c=c+D(i,1)
      END DO
      !     b is the sum of the voltages
      b=0
      DO i=1,nl
         b=b+D(i,2)
      END DO
      !     g is the average coefficient (b/c)
      g=b/c
      !     E contains the residuals
      ALLOCATE (E)
      DO i=1,nl
         E(i)=D(i,2)-g*D(i,1)
      END DO
      !     H contains the estimated voltages (the estimated Y)
      ALLOCATE (H)
      DO i=1,nl
         H(i)=g*D(i,1)+H(i)
      END DO
      !     k is the sum of the residuals      
      k=0
      DO i=1,nl
         k=k+E(i)
      END DO
      DEALLOCATE (D)
      DEALLOCATE (E)
      DEALLOCATE (H)
      !     l is the average residual
      l=k/nl
      PRINT 10, g,l
    10 FORMAT (1X,'THE LINEAR EQUATION IS : Y(X)= ',F6.3,' X + ',F6.3)
      PRINT *,'ORIGINAL     ORIGINAL     ESTIMATED     RESIDUAL'
      PRINT *,'   X            Y             Y '
      DO i=1,nl
         PRINT 20, D(i,1),D(i,2),g*D(i,1)+l,E(i)
    20   FORMAT (' ',F6.3,'       ',F6.3,'        ',F6.3,'       ',F6.3)
      END DO
    END SUBROUTINE coef
    Merci d'avance,

    Nulysses

  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
    Par défaut
    C'est une erreur de syntaxe. Pour une variable allocatable, tu dois utiliser ":" pour spécifier le nombre d'élément de chaque dimension. La ligne 12 devient :

    REAL,ALLOCATABLE,DIMENSION(:,:) :: A

    ou

    REAL,ALLOCATABLE :: A(:,:)

    (les 2 formes sont acceptables)

    Dans la subroutine coef, il y a la ligne :

    REAL,ALLOCATABLE :: D(m,2),E(nl),H(nl)

    qui cause certainement aussi problème. Techniquement, D est déjà alloué dans le programme principal. Tu dois simplement indiquer les dimensions dans la routine pour pouvoir référencé les éléments. Tu dois donc enlever le allocatable. Tu aurais pu aussi utiliser REAL :: D(:,:). Pour E et H, il y a 2 solutions. Tu dois utiliser des allocatables ou des automatics. Avec les allocatables, tu as le même problème de syntaxe qu'à la ligne 12. Avec les automatiques, tu dois simplement enlever le mot allocatable et les allocates subséquents. Ainsi, avec les automatiques, tu obtiens :

    REAL :: D(:,:) ou D(m,2)
    REAL :: E(nl),H(nl)

  3. #3
    Membre émérite 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
    Par défaut
    afin que ton compilateur soit plus strict dans ses vérification de code, tu peux utiliser les "intent" spécifiant si ta varianble est "entrante" ou "sortante" de la routine, exemple:

    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
     
    SUBROUTINE coef (D,nl)
      IMPLICIT NONE
      integer,intent(in), :: nl
      real(kind=8),dimension(:,:),intent(in) ::D
     
      INTEGER          :: i,j
      REAL              :: c,b,g,f,a,k,l
      REAL              :: E(nl),H(nl)
      !     c is the sum of the accelerations
      c=0
      DO i=1,nl
         c=c+D(i,1)
      END DO
      !     b is the sum of the voltages
      b=0
      DO i=1,nl
         b=b+D(i,2)
      END DO
      !     g is the average coefficient (b/c)
      g=b/c
      !     E contains the residuals
      ALLOCATE (E)
      DO i=1,nl
         E(i)=D(i,2)-g*D(i,1)
      END DO
      !     H contains the estimated voltages (the estimated Y)
      ALLOCATE (H)
      DO i=1,nl
         H(i)=g*D(i,1)+H(i)
      END DO
      !     k is the sum of the residuals      
      k=0
      DO i=1,nl
         k=k+E(i)
      END DO
    !     l is the average residual
      l=k/nl
      PRINT 10, g,l
    10 FORMAT (1X,'THE LINEAR EQUATION IS : Y(X)= ',F6.3,' X + ',F6.3)
      PRINT *,'ORIGINAL     ORIGINAL     ESTIMATED     RESIDUAL'
      PRINT *,'   X            Y             Y '
      DO i=1,nl
         PRINT 20, D(i,1),D(i,2),g*D(i,1)+l,E(i)
    20   FORMAT (' ',F6.3,'       ',F6.3,'        ',F6.3,'       ',F6.3)
      END DO
    END SUBROUTINE coef
    dans cette routine en particulier, tu n'a pas besoin d'utiliser allocatable pour tes tableaux E et H: il seront créer à l'appel de la fonction et détruit à la fin. pas besoin non plus de dimensionner D: il suffi de donner son nom et le fait qu'il est bi-dimentionnel (à toi de pas dépasser les indices) à noté: tu n'utilise pas le paramètre "m" (donc je l'est viré de mon exemple)
    l'utilisation des intent permet au compilateur de vérifié que tu n'écrit pas dans un paramètre d'entrée ou que tu lise dans un param de sortie etc... les trois attributs possibles sont: "in" "out" inout" (suffisament explicites!!!)

Discussions similaires

  1. Allocation dynamique tableaux 4 dimensions
    Par mecaplus dans le forum Débuter
    Réponses: 42
    Dernier message: 13/10/2011, 08h45
  2. Allocation de tableaux de longueur nulle
    Par Aleph69 dans le forum Langage
    Réponses: 7
    Dernier message: 21/07/2010, 13h14
  3. allocations, structures, tableaux
    Par sirermelchior dans le forum Débuter
    Réponses: 2
    Dernier message: 30/12/2009, 15h03
  4. allocation dynamique et tableaux de pointeurs
    Par gbardy dans le forum 4D
    Réponses: 3
    Dernier message: 06/07/2006, 11h08
  5. Allocation et réallocation dynamique de tableaux
    Par petitmic dans le forum C++
    Réponses: 4
    Dernier message: 14/03/2006, 14h59

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