用标量和数组重载
Overloading with scalars and arrays
我想从文本文件中读取数字。这些可以是标量或数组。
所以要么我打电话给
real, dimension(2) :: test
call self%ReadRealToVariable('(2F10.0)',test)
或
real :: test
call self%ReadRealToVariable('(F10.0)',test)
导入函数看起来像
subroutine ReadRealToVariable(self,Format,VarOut)
implicit none
! Declaring Part
class(FileImporter) :: self
real, dimension(:), intent(out) :: VarOut
character(len=*), intent(in) :: Format
real, dimension(size(VarOut)) :: Value
! Executing Part
call self%ReadValueToVariable(Format,Value)
end subroutine ReadRealToVariable
现在的问题是,当我尝试导入标量时,我发现标量和 rank(1) 之间的维度不匹配。我完全理解为什么会出现这个问题。现在的问题是如何处理:
有没有办法灵活地将变量分配给标量或数组?
或者我应该简单地将所有标量初始化为 real, dimension(1) :: test
?
为了让人们能够看到问题的答案...
1) 不,如果传递标量,单个例程将无法分配标量,如果传递数组,则无法分配数组。可以将不同的例程包装在通用接口后面并使其 出现 就好像单个过程的行为符合 OP 的要求。这可能已经足够好了。 OP 似乎已经解决了这个问题,这里可能还有其他几个关于通用接口的问题,所以我不会在这里写更多关于这个主题的内容。
2) 为了编写从文件中读取值的例程,我们当然可以将标量视为大小为 1 的 rank-1 数组。我不确定是否有人想在整个代码库中传播它。另一方面,我可以看到大小为 1 的秩为 1 的数组在大小为 0 的数组中很有用的情况,例如处理没有复杂条件的边缘情况。
我想从文本文件中读取数字。这些可以是标量或数组。
所以要么我打电话给
real, dimension(2) :: test
call self%ReadRealToVariable('(2F10.0)',test)
或
real :: test
call self%ReadRealToVariable('(F10.0)',test)
导入函数看起来像
subroutine ReadRealToVariable(self,Format,VarOut)
implicit none
! Declaring Part
class(FileImporter) :: self
real, dimension(:), intent(out) :: VarOut
character(len=*), intent(in) :: Format
real, dimension(size(VarOut)) :: Value
! Executing Part
call self%ReadValueToVariable(Format,Value)
end subroutine ReadRealToVariable
现在的问题是,当我尝试导入标量时,我发现标量和 rank(1) 之间的维度不匹配。我完全理解为什么会出现这个问题。现在的问题是如何处理:
有没有办法灵活地将变量分配给标量或数组?
或者我应该简单地将所有标量初始化为
real, dimension(1) :: test
?
为了让人们能够看到问题的答案...
1) 不,如果传递标量,单个例程将无法分配标量,如果传递数组,则无法分配数组。可以将不同的例程包装在通用接口后面并使其 出现 就好像单个过程的行为符合 OP 的要求。这可能已经足够好了。 OP 似乎已经解决了这个问题,这里可能还有其他几个关于通用接口的问题,所以我不会在这里写更多关于这个主题的内容。
2) 为了编写从文件中读取值的例程,我们当然可以将标量视为大小为 1 的 rank-1 数组。我不确定是否有人想在整个代码库中传播它。另一方面,我可以看到大小为 1 的秩为 1 的数组在大小为 0 的数组中很有用的情况,例如处理没有复杂条件的边缘情况。