У меня есть несколько переменных массива в модуле, которые являются динамическими, а затем распределены в одной из двух подпрограмм вне модуля. Однако в одной подпрограмме я хочу, чтобы массив был 1D, в другой подпрограмме я хочу, чтобы он был 2D.Ранг динамической матрицы
В принципе я хотел бы что-то подобное в модуле, но я не считаю, что это возможно в области декларации ?:
if (option1) then
real (kind=8), allocatable :: arr1(:)
else
real (kind=8), allocatable :: arr1(:,:)
endif
Есть ли способ в размещаемых декларациях имеют размерность быть динамичным?
Редактировать 1: Причина, по которой я делаю это, я добавляю новую подпрограмму к существующей кодовой базе, но я хочу быть обратно совместимой. arr1 используется только двумя отдельными подпрограммами, основная программа не использует его вообще. Вот некоторые более полный код, показывающий идею:
program myprog
use inputs
call read_inputs
if (option1) then
call do1
else
call do2
endif
contains
subroutine read_inputs
use inputs
use mymod
!!!read from file .logical. option1, integers N1, N2
!allocate arrays
if (option1) then
else
endif
end subroutine read_inputs
subroutine do1
use inputs
use mymod
allocate(arr1(N1))
!do stuff with arr1
end subroutine do1
subroutine do2
use inputs
use mymod
allocate(arr1(N1,N2))
!do stuff with arr1
end subroutine do2
end program
module inputs
logical :: option1
integer :: N1, N2
end module inputs
module mymod
use inputs
!!!!can I do something here to make the rank of arr1 dynamic? I don't think the following will work
if (option1)
real (kind=8), allocatable :: arr1(:)
else
real (kind=8), allocatable :: arr1(:,:)
endif
end module mymod
Я могу только иметь две отдельные переменные в MyMod, arr1 и arr1_new. Я просто надеялся избежать этого.
Вы можете перегрузить оператор 'allocate' с помощью подпрограммы, выполняющей задание. Fortran 90 почти 26 лет. Какой компилятор вы используете? Если вы используете современный компилятор Fortran (2003+), я бы предложил определить производный тип данных с 2 и 3-мерными распределяемыми типами-типами с соответствующими процедурами, связанными с типом. Fortran 90 не позволяет этого, вместо этого вам придется использовать указатели, которые подвержены утечке памяти. – jlokimlin
Я не понимаю ваш вопрос. Как выглядит массив в основной программе или модуле? Является ли это 1D или 2D? Описывает ли основная программа или модуль вопрос о том, как обрабатывается подпрограмма (1D или 2D)? Возможно, вы можете использовать простую ассоциацию хранения, но вам действительно нужно показать больше кода. Ceterum censeo 'kind = 8' является уродливым, вонючим и злым http://stackoverflow.com/a/856243/721644 –
Компиляторы @jlokimlin не являются проблемой, но, к сожалению, это большая база кода с несколькими пользователями, поэтому для в обозримом будущем это будет Fortran90. – Michael