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 :

Tableaux dynamiques


Sujet :

Fortran

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 55
    Points : 43
    Points
    43
    Par défaut Tableaux dynamiques
    Bonjour

    J'ai créé un programme qui travaille sur deux tableaux.
    Je commence par une routine qui va lire les tableaux en question dans un fichier.
    Je traite ensuite ces tableaux afin de supprimer les lignes qui ne contiennent que des 0. Du coup, ils changent de taille.

    Voilà en gros ce 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
     
    program NT
      double precision, allocatable :: A(:,:), B(:)
      integer M,N
     
      call DataIn(A,B,N,M)
     
      ! ... Travail sur A et B
      ! Ici A et B doivent avoir les dimensions M et N 
      ! la déclaration du style A(1000,1000) n'est donc pas possible
     
      deallocate(A)
      deallocate(B)
    end
    avec la fonction :

    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
     
    subroutine DataIn(A, B, N, M)
    integer i, M, N, Mred
    integer ind(M)
    double precision Alect(M,N), Blect(M), lign
    double precision, allocatable :: A(:,:), B(:)
     
          open(10,file='ex2.txt')
     
    ! -- Lecture de la matrice Alect
          do i=1,M
            read(10,*),(Alect(i,j),j=1,N)
          enddo
     
    ! -- Lecture du vecteur Blect
          do i=1,m
            read(10,*),Blect(i)
          enddo
     
          close(10)
     
    ! -- Reduction de A 
          Mred=0
     
          !Recherche de la valeur de Mred : nouvelle dimension 1 de A
          do i=1,M 			
            lign=0
            do j=1,N 		
              lign = lign + alect(i,j)
            enddo
            if(lign.ne.0) then 	! si la ligne de A n'est pas vide
    	  Mred=Mred+1
              ind(Mred)=i
             else 			     ! si la ligne de A est vide
              if(blect(i).ne.0) then    ! si la ligne de B n'est pas vide
                Mred=Mred+1
                ind(Mred)=i
                endif
            endif
          enddo  
     
          print*,'Mred=',Mred
     
          allocate(B(Mred))                       ! ligne 527
          allocate(A(Mred,Nred))              ! ligne 528
     
          do i=1,Mred
            A(i,:)=Alect(ind(i),:)
            B(i)=Blect(ind(i))
          enddo
     
          print*,'A='
          do i=1,Mred
            print*,(A(i,j),j=1,Nred)
          enddo
          print*,'B=',B
     
          M=Mred         
     end

    La fonction seule fonctionne correctement, je l'ai testée à part.
    Mon problème vient de la déclaration de A et B comme des tableaux dynamiques.
    Avec ce code, j'obtiens l'erreur :
    PGF90-S-0084-Illegal use of symbol b - must be an allocatable array (sample5.f90: 527)
    PGF90-S-0084-Illegal use of symbol a - must be an allocatable array (sample5.f90: 528)

    J'ai essayé plusieurs combinaisons, mais je n'ai pas trouvé comment déclarer A et B pour que ça passe.

  2. #2
    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
    Ta fonction est mal concue: tu utilises A et B avant de les allouer ! Il faut que tu alloues tes tableaux avant de les utiliser, c'est obligatoire (ALLOCATED doit renvoyer TRUE).
    Ce que tu souhaites faire, si je comprend bien, c'est une re-allocation: une fois alloues a une certaine taille, tu veux changer cette taille en cours d'execution. Il va te falloir utiliser le type POINTER, ce qui est plus complique...

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 55
    Points : 43
    Points
    43
    Par défaut
    Exact!

    Il y avait une erreur, j'utilisais a au lieu de alect et b au lieu de blect.

    J'ai corrigé (mais j'ai toujours le meme probleme).

    Par contre, c'est exactement ce que tu dis que je souhaite faire : changer la taille des tableaux A et B au cours du programme. Je ne pensais pas que c'était possible.
    D'après ce que tu dis si.

    Je connais les pointeurs (j'en ai utilisé il y a bien longtemps, et surtout en C), mais je ne vois pas trop comment m'y prendre!...

  4. #4
    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
    L'utilisation des pointeurs s'apparente a celle du C, avec tous les avertissements qui vont avec. C'est nettement plus bas niveau que d'habitude en Fortran, donc ils ne doivent etre utilises qu'en dernier recours. Note egalement que les pointeurs sont une extension fortran 90, et ne sont donc pas compris par un compilateur fortran 77.

    Tu peux trouver un exemple d'utilisation des pointeurs ici.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 55
    Points : 43
    Points
    43
    Par défaut
    Merci, ça m'a l'air assez claire, et c'est exactement ce que je veux faire!

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 55
    Points : 43
    Points
    43
    Par défaut
    Ok ça marche, mais j'ai du rajouter des blocs 'interface' pour que ça passe à la compilation.

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

Discussions similaires

  1. [D2005]Problème de tableaux dynamique
    Par Laurent Dardenne dans le forum Delphi .NET
    Réponses: 8
    Dernier message: 26/07/2005, 11h56
  2. tableaux dynamiques
    Par Mynautor dans le forum C++
    Réponses: 23
    Dernier message: 12/02/2005, 02h45
  3. [D7] Tableaux dynamiques dans un record
    Par bobby-b dans le forum Langage
    Réponses: 2
    Dernier message: 30/06/2004, 23h23
  4. Article sur les tableaux dynamiques
    Par Eric Sigoillot dans le forum Langage
    Réponses: 2
    Dernier message: 16/04/2004, 22h00
  5. [Kylix] Tableaux dynamiques sour Kylix2
    Par Krän dans le forum EDI
    Réponses: 6
    Dernier message: 07/10/2003, 14h31

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