gpt4 book ai didi

function - 函数结果中的 Fortran 类 (*)

转载 作者:行者123 更新时间:2023-12-02 00:13:06 25 4
gpt4 key购买 nike

我在使用本文中详细介绍的函数时遇到错误。

出现问题是因为我试图返回与输入类型。有人能提出解决方案吗?我最初为每个函数都有一个函数类型,然后是一个通用接口(interface)将它们分组为相同的名称。现在我正在努力使用多态性将所有内容放在一个函数中。

这是 gfortran 给我的错误。

gfortran -o build/lib/foul.o -c -ffree-form -g -J./build/lib lib/foul.f
lib/foul.f:471.45:

Function cassign (expr, a, b, wrn) Result (c)

我尝试使用可分配数组。然后在主程序中我这样做

Character (len=65), Allocatable :: sc(:)
Integer, Allocatable :: ic(:)
Real, Allocatable :: rc(:)

Allocate (sc(1))
Allocate (ic(1))
Allocate (rc(1))

sc = cassign (ra < rb, sa, sb)
ic = cassign (ra < rb, ia, ib)
rc = cassign (ra < rb, ra, rb)

这将返回以下错误

gfortran -o build/utests/test_foul.o -c -ffree-form -g -J./build/lib utests/test_foul.futests/test_foul.f:315.7:

sc = cassign (ra < rb, sa, sb)
1
Error: Can't convert CLASS(*) to CHARACTER(1) at (1)
utests/test_foul.f:316.7:

ic = cassign (ra < rb, ia, ib)
1
Error: Can't convert CLASS(*) to INTEGER(4) at (1)
utests/test_foul.f:317.7:

rc = cassign (ra < rb, ra, rb)
1
Error: Can't convert CLASS(*) to REAL(4) at (1)



1
Error: CLASS variable 'c' at (1) must be dummy, allocatable or pointer
lib/foul.f:495.10:

c = a
1

Error: Nonallocatable variable must not be polymorphic in intrinsic
assignment at (1) - check that there is a matching specific subroutine
for '=' operator
lib/foul.f:497.10:

c = b
1

这是我编写的函数。变量ab可以是任何类型字符、整数或实数。输出类型应与输入 ab 匹配如果两种类型匹配,则函数 type_match (a, b) 返回 true,否则返回 false。

Function cassign (expr, a, b, wrn) Result (c)

Logical, Intent(in) :: expr
Class (*), Intent(in) :: a, b
Logical, Intent (out), Optional :: wrn

Class (*) :: c

Logical :: warn, tma, tmb

!!$ Perform warning tests (performs type matching).
If (Present (wrn)) Then

!!$ Matching input types.
tma = type_match (a, b)
if (tma) Then

tmb = type_match (a, c)

!!$ Matching input and output types.
If (tmb) Then
If (expr) Then
c = a
Else
c = b
End If
wrn = .False.

!!$ Warning: Non-matching types.
Else
wrn = .True.
End If

Else

wrn = .True.

End If

Else

If (expr) Then
c = a
Else
c = b
End If

End If

End Function cassign

最佳答案

我不确定我是否建议执行下面写的操作,而是更喜欢使用泛型,但我会尝试解释。

首先要注意的是,正如错误消息所述,对于非虚拟参数多态变量(例如 c),该变量必须具有指针allocatable 属性。在这里,函数结果可分配是有意义的。

添加allocatable属性后,您似乎经历了两件事与allocatable多态变量的赋值相关:一次在函数中设置结果,一次使用函数的结果。

您使用的 gfortran 版本(显然)不支持多态变量的内部赋值。您可以使用等效的内容,可以说其意图更加清晰:

allocate (c, source=a)  ! You may also need to provide bounds for c
! for some gfortran.

这就是函数中赋值问题的解决方案。

但是,使用函数结果,您现在返回一个多态结果。这意味着接受赋值的变量也必须是多态的,或者赋值不能是内在的。这是

Error: Can't convert CLASS(*) to INTEGER(4) at (1)

尝试内部赋值时出错。

要么使所有内容都多态,坚持使用泛型,要么使用定义的赋值。下面是后一种情况的简化示例。 [根据需要调整和扩展。]

module hello_bob
interface assignment(=)
module procedure int_equal_func_class
end interface

contains

subroutine int_equal_func_class(a,b)
integer, intent(out) :: a(:)
class(*), intent(in) :: b(:)

select type (b)
type is (integer)
a = b
end select
end subroutine int_equal_func_class

function func(a)
class(*), intent(in) :: a(:)
class(*), allocatable :: func(:)

! No intrinsic assignment supported, also see note about bounds
allocate(func, source=a)
end function func

end module hello_bob

program bob
use hello_bob
integer i(4)

i=func([1,2,3,4])
print*, i

end program bob

关于function - 函数结果中的 Fortran 类 (*),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26951750/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com