我有两个函数,一个将分隔的字符串拆分为整数 数组,另一个是真正的数组。我试图超载。
Interface split
Module Procedure split_to_int_unidim
Module Procedure split_to_real_unidim
End Interface split
Function split_to_int_unidim (a, delim, pos) Result (b)
Character(len=*), Intent (in) :: a, delim
Character(len=*), Intent (in), Optional :: pos
Integer, Allocatable :: b(:)
End Function
Function split_to_real_unidim (a, delim, pos) Result (b)
Character(len=*), Intent (in) :: a, delim
Character(len=*), Intent (in), Optional :: pos
Real, Allocatable :: b(:)
End Function
我收到错误
gfortran -o build/lib/foul.o -c -ffree-form -g -J./build/lib lib/foul.f
lib/foul.f:22.41:
Module Procedure split_to_real_unidim
1
Error: Ambiguous interfaces 'split_to_real_unidim' and 'split_to_int_unidim'
in generic interface 'split' at (1)
我希望由于函数的返回属于不同的类型,我会没事的。 但是我似乎错误地看错了。有什么方法可以用同名来称呼它们吗?如果是这样,我需要做哪些修改?
答案 0 :(得分:0)
使用这两个功能的一个问题是包括 一个额外的变量来解决参数中的ambiguation, 使他们的使用不直观。出现问题因为我们想要 将分隔的字符串拆分为整数或实数数组而不用 必须记住包含一个非直观的变量。
一个好的解决方案是将第一个输出元素b1包含为 输出参数。这个额外的论点是一致的 使用这两个功能,也可以解决ambiguation问题。
因此解决方案如下
Interface split
Module Procedure split_to_int_unidim
Module Procedure split_to_real_unidim
End Interface split
Function split_to_int_unidim (a, delim, b1, pos) Result (b)
Character(len=*), Intent (in) :: a, delim
Character(len=*), Intent (in), Optional :: pos
Integer, Intent(out) :: b1
Integer, Allocatable :: b(:)
...
b1 = b(1)
End Function
Function split_to_real_unidim (a, delim, b1, pos) Result (b)
Character(len=*), Intent (in) :: a, delim
Character(len=*), Intent (in), Optional :: pos
Real, Intent(out) :: b1
Real, Allocatable :: b(:)
...
b1 = b(1)
End Function