2

Le projet dans lequel je travaille exige qu'une quantité considérable de tableaux soit passée à travers un tas de sous-routines et de fonctions, donc j'opte pour un module.Comment indiquer à une sous-routine, laquelle des matrices allouables du module utilise

Ces tableaux sont tous allouables, ils ne causent pas beaucoup de problèmes, sauf quand je dois préciser lequel de ces tableaux devrait utiliser un sous-programme. La façon dont je gère le code à exécuter, c'est complètement exagéré.

La façon dont il fonctionne:

Program Principal 
Use Info 
open(unit=1,file="dadose6h.dat") 
call get_data 
call sortsupply 
call sortcost 
call ratecapacity 
end Program 

Module Info 
integer i,j 
integer, dimension (:), allocatable :: supply 
integer, dimension (:), allocatable :: cost 
integer, dimension (:,:), allocatable :: capacity 
integer, dimension (:,:), allocatable :: demand 
End module info 


subroutine get_data 
use info 
read(1,*) j,i 
allocate (supply (j)) 
allocate (cost (j)) 
allocate (capacity (j,i)) 
allocate (demand (j,i)) 
read(1,*) supply 
read(1,*) cost 
read(1,*) capacity 
read(1,*) demand 
end subroutine 

Subroutine SortCost 
use info 
integer u 
!u=cost(1) 
!... 
print*, cost 
End subroutine 

Subroutine Sortsupply 
use info 
integer u 
!u=supply(1) 
!... 
print*, supply 
End subroutine 

Subroutine ratecapacity 
use info 
integer u 
!u=capacity(1,1)  
!... 
print *, j,i 
print*, capacity 
End subroutine 

L'exemple ci-dessus ont deux sous-routines sortcost et sortsupply qui sont égaux, en plus du tableau qui sont triées. Je voulais vraiment un sous-programme unique pour faire ces deux tâches. Je ne peux pas déclarer la bonne façon.

La façon dont il devrait être:

Program Principal 
Use Info 
open(unit=1,file="dadose6h.dat") 
call get_data 
call sort(supply) 
call sort(cost) 
call rate(capacity) 
end Program 

Module Info 
integer i,j 
integer, dimension (:), allocatable :: supply 
integer, dimension (:), allocatable :: cost 
integer, dimension (:,:), allocatable :: capacity 
integer, dimension (:,:), allocatable :: demand 
End module info 


subroutine get_data 
use info 
read(1,*) j,i 
allocate (supply (j)) 
allocate (cost (j)) 
allocate (capacity (j,i)) 
allocate (demand (j,i)) 
read(1,*) supply 
read(1,*) cost 
read(1,*) capacity 
read(1,*) demand 
end subroutine 

Subroutine Sort(X) 
!use info 
!i dunno how the declaration should be 
integer u 
!u=X(1) 
!... 
print*, "Sort:",X 
End subroutine 

Subroutine rate(X) 
!use info 
!i dunno how the declaration should be neither 
integer u 
!u=X(1,1) 
!... 
print*, "rate:", X 
End subroutine 

J'ai essayé certaines déclarations, mais aucun travail, ces gars-là ont un problème similaire FORTRAN - allocatable array in subroutine, How to pass allocatable arrays to subroutines in Fortran, dans la première, les réponses mettent la faute dans l'intention, mais je déjà essayé (inout, out, in) et ne fonctionne toujours pas. Les seconds ont une réponse parlant d'une interface explicite mais je ne ferai rien sur le statut d'allocation.

Remarque: Les enseignants que je pose cette question manquent couramment ce point, la question n'est pas de passer un tableau allouable à une routine, je peux déjà le faire avec le module Info, mais je dois montrer le sous-programme .

Je voudrais vraiment savoir qui pourrait écrire ces deux déclarations du sous-programme. Trier (tableau unidimensionnel) et Taux (bidimensionnel). Ou au moins apprends-moi.

Contenu du fichier dadose6h.dat:

4 
7 
1000 2000 2000 2000 
100 100 100 100 
10 10 74 19 
60 1 25 20 
90 50 7 2 
11 31 51 96 
15 10 94 36 
52 89 47 13 
30 35 4 12 
100 150 50 200 
100 100 200 75 
100 100 200 250 
100 100 150 250 
150 100 200 250 
200 100 200 250 
200 150 200 250 
+0

Utilisez tag fortran pour toutes les questions Fortran pour obtenir plus d'attention. Fortran 90 est juste une ancienne version, vous pouvez ajouter tag fortran90 au lieu d'un autre tag si votre question est spécifique à cette ancienne version .. –

+0

S'il vous plaît prendre soin lors de l'écriture de la question, ise capitale et mettre des espaces après virgules et points. Cela prend beaucoup de travail pour l'éditer. –

+0

Je crains que les enseignants aient raison et que vous insistiez sur un mauvais design du code. –

Répondre

1

Votre conception est encore très confus pour moi. Je voudrais juste faire:

Module Info 
integer i,j 
integer, dimension (:), allocatable :: supply 
integer, dimension (:), allocatable :: cost 
integer, dimension (:,:), allocatable :: capacity 
integer, dimension (:,:), allocatable :: demand 
End module info 


Module Procedures 

contains 

    Subroutine Sort(X) 
    integer :: X(:) 

    integer u 
    !u=X(1) 
    !... 
    print*, "Sort:",X 
    End subroutine 

End module Procedures 


Program Principal 
Use Info 
Use Procedures 

open(unit=1,file="dadose6h.dat") 
call get_data 
call sort(supply) 
call sort(cost) 
call rate(capacity) 
end Program 

C'est un changement très petit, donc il est possible que je ne comprends pas votre description. Je ne vois pas pourquoi la procédure de tri devrait exiger le module avec les données.

+0

L'exemple n'a aucune raison d'utiliser les données du module, mais le problème d'origine avait. J'ai fait quelques changements donc l'exemple de routine de tri a cette raison (print *, i). Merci pour la réponse, ça m'a beaucoup aidé. –