我強烈建議您遵循@Vladimir F的建議,並將您的變量封裝在派生數據類型中。您可以採用associate
結構調用舊代碼期待var0, var1, ..,
等最後,我們可以重載型的名,來獲取的代碼的Java風格的構造函數如下
module type_MyArray
implicit none
private
type, public :: MyArray
! type-components
real, dimension(:), allocatable :: var0, var1, var2
contains
! type-bound procedures
procedure :: create => create_my_array
procedure :: destroy => destroy_my_array
end type MyArray
interface MyArray
module procedure my_array_constructor
end interface MyArray
contains
pure function my_array_constructor(n) result (return_value)
! Dummy arguments
integer, intent (in) :: n
type (MyArray) :: return_value
call return_value%create(n)
end function my_array_constructor
pure subroutine create_my_array(self, n)
! Dummy arguments
class(MyArray), intent(in out) :: self
integer, intent(in) :: n
allocate(self%var0(n))
allocate(self%var1(n))
allocate(self%var2(n))
end subroutine create_my_array
pure subroutine destroy_my_array(self)
! Dummy arguments
class(MyArray), intent(in out) :: self
if (allocated(self%var0)) deallocate(self%var0)
if (allocated(self%var1)) deallocate(self%var1)
if (allocated(self%var2)) deallocate(self%var2)
end subroutine destroy_my_array
end module type_MyArray
program main
use type_MyArray, only: MyArray
use old_code, only: do_something
implicit none
type (MyArray) :: foo, bar
! Allocate memory
foo = MyArray(42)
bar = MyArray(4200)
associate(var0 => foo%var0, var1 => bar%var1)
! Call old code using var0 and var1
call do_something(var0, var1)
end associate
! Release memory
call foo%destroy()
call bar%destroy()
end program main
創建一個派生類型,並將它們存儲在那裏。或者存儲指向這些的指針。 Fortran中沒有數組數組。 –
我同意@VladimirF。請注意,模塊內的每個變量聲明都會自動繼承'save'屬性。如果你想爲'n'的不同值創建'var0,var1,var2,...,var1000'數組的不同實例,你必須將變量作爲類型組件包含在派生數據類型中。 – jlokimlin
有一個數組的結構,但爲什麼?如果在你的例程和功能中使用TEST,那麼你將它們全部顯示在那裏。 array(3,:)= array(2,:)對於var1(:) = var2(:)來說並不算什麼時間保護。如果var1是質量,var2是重量,那麼它比質量(1,:)是質量和質量(2,:)是重量更容易理解。如果var1是X軸,而Var2是Y軸,那麼xy(:, :)作爲二維數組是有意義的......否則將它們作爲數組可能會更有意義? – Holmz