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 :
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 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
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.
Partager