Проект, в котором я работаю, требует, чтобы значительное количество массивов передавалось через кучу подпрограмм и функций, поэтому я выбираю модуль.Как указать подпрограмму, какая из распределяемых модулей массивов использует
Эти массивы являются выделенными, они не вызывают особых проблем, за исключением случаев, когда я должен указать, какой из этих массивов должен использовать подпрограмма. Как я управляю кодом для запуска, он полностью переборщил.
Как это работает:
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
В приведенном выше примере есть две подпрограммы sortcost и sortsupply, которые равны, кроме массива, которые сортируются. Я действительно хотел создать уникальную подпрограмму для выполнения этих двух задач. Я просто не могу сказать правильный путь.
так оно и должно быть:
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
Я попробовать некоторые заявления, но ни один работу, эти ребята имеют аналогичные проблемы FORTRAN - allocatable array in subroutine, How to pass allocatable arrays to subroutines in Fortran, в первую ответы поставить свою вину в намерении, но я уже пробовал (inout, out, in) и до сих пор не работает. У второго есть ответ, говорящий о явном интерфейсе, но я ничего не буду делать о статусе распределения.
Примечание: Учителя, которых я задаю этот вопрос, упускают из виду эту проблему, вопрос заключается не в передаче выделенного массива в подпрограмму, я уже могу сделать это с помощью модуля Info, однако мне нужно показать подпрограмму, которая ,
Я бы очень оценил, кто мог бы написать эти две декларации подпрограммы. Сортировка (одномерный массив) и Rate (двумерный). Или, по крайней мере, научи меня.
Содержание 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
Используйте тег fortran для всех вопросов Fortran, чтобы привлечь больше внимания. Fortran 90 - это только одна старая версия, вы можете добавить тег fortran90 вместо какого-либо другого тега, если ваш вопрос относится к этой старой версии. –
Пожалуйста, позаботьтесь о написании вопроса, ise capital I и поместите пробелы после запятых и полных остановок. Для его редактирования требуется много работы. –
Я боюсь, что учителя могут быть правы, и вы настаиваете на неправильном дизайне кода. –