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.