2017-02-12 24 views
2

Проект, в котором я работаю, требует, чтобы значительное количество массивов передавалось через кучу подпрограмм и функций, поэтому я выбираю модуль.Как указать подпрограмму, какая из распределяемых модулей массивов использует

Эти массивы являются выделенными, они не вызывают особых проблем, за исключением случаев, когда я должен указать, какой из этих массивов должен использовать подпрограмма. Как я управляю кодом для запуска, он полностью переборщил.

Как это работает:

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 
+0

Используйте тег fortran для всех вопросов Fortran, чтобы привлечь больше внимания. Fortran 90 - это только одна старая версия, вы можете добавить тег fortran90 вместо какого-либо другого тега, если ваш вопрос относится к этой старой версии. –

+0

Пожалуйста, позаботьтесь о написании вопроса, ise capital I и поместите пробелы после запятых и полных остановок. Для его редактирования требуется много работы. –

+0

Я боюсь, что учителя могут быть правы, и вы настаиваете на неправильном дизайне кода. –

ответ

1

Ваш дизайн до сих пор очень запутанной для меня. Я бы просто сделал это:

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 

Это очень небольшое изменение, поэтому возможно, что я не понимаю вашего описания. Я не вижу причин, по которым процедура сортировки должна требовать модуля с данными.

+0

В примере нет причин использовать данные модуля, но исходная проблема была. Я внес некоторые изменения, поэтому пример процедуры сортировки имеет такую ​​причину (print *, i). Спасибо за ответ, он очень помог. –