Fortran函数,根据输入返回标量OR数组
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Fortran函数,根据输入返回标量OR数组相关的知识,希望对你有一定的参考价值。
我试图在Fortran(95)中创建一个函数,它将输入一个字符串(test
)和一个字符(class
)。该函数将test
的每个字符与字符class
进行比较,如果它们具有相同的class1则返回.true.
的逻辑,否则返回.false.
。
函数(以及运行它的程序)定义如下:
!====== WRAPPER MODULE ======!
module that_has_function
implicit none
public
contains
!====== THE ACTUAL FUNCTION ======!
function isa(test ,class )
implicit none
logical, allocatable, dimension(:) :: isa
character*(*) :: test
character :: class
integer :: lt
character(len=:), allocatable :: both
integer, allocatable, dimension(:) :: intcls
integer :: i
lt = len_trim(test)
allocate(isa(lt))
allocate(intcls(lt+1))
allocate(character(len=lt+1) :: both)
isa = .false.
both = class//trim(test)
do i = 1,lt+1
select case (both(i:i))
case ('A':'Z'); intcls(i) = 1! uppercase alphabetic
case ('a':'a'); intcls(i) = 2! lowercase alphabetic
case ('0':'9'); intcls(i) = 3! numeral
case default; intcls(i) = 99! checks if they are equal
end select
end do
isa = intcls(1).eq.intcls(2:)
return
end function isa
end module that_has_function
!====== CALLER PROGRAM ======!
program that_uses_module
use that_has_function
implicit none
integer :: i
i = 65
! Reducing the result of "isa" to a scalar with "all" works:
! V-V
do while (all(isa(achar(i),'A')))
print*, achar(i)
i = i + 1
end do
! Without the reduction it doesn''t:
!do while (isa(achar(i),'A'))
! print*, achar(i)
! i = i + 1
!end do
end program that_uses_module
我想在do while
循环中使用此函数,例如,如上面的代码所示。
问题是,例如,当我使用两个标量(等级0)作为输入时,函数仍然将结果作为数组(等级1)返回,因此为了使其作为do while
循环的条件工作,我必须减少例如,使用all
得到标量。
我的问题是:我可以使函数有条件地返回一个标量吗?如果没有,那么是否可以使函数与向量和标量输入一起工作并分别返回向量和标量输出?
我在这里所谓的课程,例如,大写或小写字母,或数字等.↩
你无法使函数有条件地返回标量或向量。
但你猜对了,有一个解决方案。您将使用通用函数。
你编写了2个函数,一个采用标量并返回标量isas
,第二个采用向量并返回向量isav
。
从模块外部,您可以使用相同的名称调用它们:isa
。您只需要在模块的开头编写其接口:
module that_has_function
implicit none
public
interface isa
module procedure isas, isav
end interface isa
contains
...
当调用isa
时,由于参数的类型,编译器将知道使用哪一个。
函数结果的等级不能以执行流为条件。这包括通过评估表达式进行选择。
如果标量结果的减少太多,那么你可能会惊恐地发现可以做什么。例如,我认为派生类型和定义的操作。
但是,我认为一般来说,功能参考的排名不清楚是不好的设计。我的答案是:不,你不能,但那很好,因为你真的不想。
关于minval
的例子,一些事情.1如评论中所述,minval
可能会采取dim
论证。所以
integer :: X(5,4) = ...
print *, MINVAL(X) ! Result a scalar
print *, MINVAL(X,dim=1) ! Result a rank-1 array
符合问题的愿望。
但是,在引用该函数时,函数结果的等级仍然是“已知的”。简单地使用dim
参数意味着结果是一个比输入数组小1而不是标量的数组。结果的等级不依赖于dim
参数的值。
如other answer所述,您可以使用通用接口具有类似功能。同样,已解决的特定函数(无论选择哪个)将在引用时具有已知等级的结果。
1该评论实际上是关于minloc
,但minval
似乎更适合该主题。
以上是关于Fortran函数,根据输入返回标量OR数组的主要内容,如果未能解决你的问题,请参考以下文章
fortran调用 带有参数 且 返回类型为数组的函数 及 相关歧义分析