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
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 .. –
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. –
Je crains que les enseignants aient raison et que vous insistiez sur un mauvais design du code. –