Fortran函数,根据输入返回标量OR数组

时间:2018-02-27 17:09:15

标签: string function fortran

我正在尝试在Fortran(95)中创建一个函数,它将输入一个字符串(test)和一个字符(class)。该函数将test的每个字符与字符class进行比较,如果它们属于同一类 1 且{{1},则返回.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 循环中使用此函数,例如,如上面的代码所示。

问题是,例如,当我使用两个标量(等级0)作为输入时,函数仍然将结果作为数组(等级1)返回,因此使其作为{{1}的条件工作}例如,我必须使用do while将结果缩减为标量。

我的问题是:我可以使函数有条件地返回标量吗?如果没有,那么是否可以使函数与向量和标量输入一起工作并分别返回向量和标量输出?

1。我在这里称之为类,例如,大写或小写字母或数字等.↩

2 个答案:

答案 0 :(得分:4)

您无法使该函数有条件地返回标量或向量。

但你猜对了,有一个解决方案。您将使用通用函数。

你编写了2个函数,一个采用标量并返回标量isas,第二个函数采用向量并返回向量isav

从模块外部,您可以使用相同名称调用它们:isa。您只需要在模块的开头编写其接口:

module that_has_function
implicit none
public

interface isa
    module procedure isas, isav
end interface isa

contains
...

当调用isa时,由于参数的类型,编译器将知道使用哪一个。

答案 1 :(得分:2)

函数结果的等级不能以执行流为条件。这包括通过评估表达式进行选择。

如果标量结果的减少太多,那么你可能会惊恐地发现可以做什么。例如,我认为派生类型和定义的操作。

但是,我认为一般来说,功能参考的排名不明确是不好的设计。我的回答是:不,你不能,但那很好,因为你真的不想。

关于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似乎更适合该主题。