在 Fortran 中定义具有非连续索引的数组
Defining an Array with Non-Consecutive Indices in Fortran
Is it possible to define an array with non-consecutive indices in Fortran 90?
以下代码returns出错(Error: The module or main program array 'test' at (1) must have constant shape
):
program example
implicit none
integer, dimension((/1,3/)) :: test
end
是否有另一种方法来定义这样的数组,或者这根本不允许吗?
您可以自己实现该类型。这是一种混乱且低效的方法。
module WeirdArray
implicit none
private
type, public :: Warray
private
integer, dimension(:), allocatable :: indeces
real, dimension(:), allocatable :: vals
contains
procedure, pass :: init
procedure, pass :: get
procedure, pass :: set
end type
contains
subroutine init(this, i, v)
class(warray), intent(out) :: this
integer, dimension(:) :: i
real, dimension(size(i)) :: v
this%indeces = i
this%vals = v
end subroutine init
function get(this, indx) result(x)
class(warray), intent(in) :: this
integer, intent(in) :: indx
real :: x
integer, dimension(:), allocatable :: p
integer :: i
p = pack([(i,i=1,size(this%indeces))],this%indeces==indx)
x = this%vals( p(1) )
end function get
subroutine set(this, indx, x)
class(warray), intent(inout) :: this
integer, intent(in) :: indx
real, intent(in) :: x
integer, dimension(:), allocatable :: p
integer :: i
p = pack([(i,i=1,size(this%indeces))],this%indeces==indx)
this%vals( p(1) ) = x
end subroutine set
end module WeirdArray
你可以这样使用它:
program main
use weirdArray
implicit none
type(Warray) :: wa
call wa%init([5,12], [10.0, 24.0])
write(*,*) wa%get(5)
call wa%set(5, 3.14)
write(*,*) wa%get(5)
write(*,*) wa%get(12)
end program main
Is it possible to define an array with non-consecutive indices in Fortran 90?
以下代码returns出错(Error: The module or main program array 'test' at (1) must have constant shape
):
program example
implicit none
integer, dimension((/1,3/)) :: test
end
是否有另一种方法来定义这样的数组,或者这根本不允许吗?
您可以自己实现该类型。这是一种混乱且低效的方法。
module WeirdArray
implicit none
private
type, public :: Warray
private
integer, dimension(:), allocatable :: indeces
real, dimension(:), allocatable :: vals
contains
procedure, pass :: init
procedure, pass :: get
procedure, pass :: set
end type
contains
subroutine init(this, i, v)
class(warray), intent(out) :: this
integer, dimension(:) :: i
real, dimension(size(i)) :: v
this%indeces = i
this%vals = v
end subroutine init
function get(this, indx) result(x)
class(warray), intent(in) :: this
integer, intent(in) :: indx
real :: x
integer, dimension(:), allocatable :: p
integer :: i
p = pack([(i,i=1,size(this%indeces))],this%indeces==indx)
x = this%vals( p(1) )
end function get
subroutine set(this, indx, x)
class(warray), intent(inout) :: this
integer, intent(in) :: indx
real, intent(in) :: x
integer, dimension(:), allocatable :: p
integer :: i
p = pack([(i,i=1,size(this%indeces))],this%indeces==indx)
this%vals( p(1) ) = x
end subroutine set
end module WeirdArray
你可以这样使用它:
program main
use weirdArray
implicit none
type(Warray) :: wa
call wa%init([5,12], [10.0, 24.0])
write(*,*) wa%get(5)
call wa%set(5, 3.14)
write(*,*) wa%get(5)
write(*,*) wa%get(12)
end program main