尝试使用时出现以下错误
character
Type Is
gfortran -o build/lib/larsa.o -c -ffree-form -g -J./build/lib lib/larsa.f
lib/larsa.f:1558.14:
Type Is (Character)
1
Error: The type-spec at (1) shall specify that each length type parameter is assumed
lib/larsa.f:1490.14:
Type Is (Character)
1
Error: The type-spec at (1) shall specify that each length type parameter is assumed
这是我编码的子程序
Subroutine splits &
( &
s, delim, &
t1, t2, t3, t4, t5, t6, t7, t8, &
pos &
)
Character (len=*), Intent (in) :: s, delim
Character (len=*), Intent (in), Optional :: pos
Class (*), Intent (out) :: t1
Class (*), Intent (out), Optional :: t2, t3, t4, &
t5, t6, t7, t8
Integer :: nf
Select Type (t1)
Type Is (Character(len=*))
If (Present (pos)) Then
If (Present (t5)) Then
If (Present (t8)) Then
Call splits_str_to_str (s, delim, t1, t2, t3, t4, &
t5, t6, t7, t8, pos)
Else If (Present (t7)) Then
Call splits_str_to_str (s, delim, t1, t2, t3, t4, &
t5, t6, t7, pos)
Else If (Present (t6)) Then
Call splits_str_to_str (s, delim, t1, t2, t3, t4, &
t5, t6, pos)
此外,我在很多参数上使用无限多态实体。
然后,对于所有这些事情,Select Type
变得复杂。编译器
给我错误
gfortran -o build/lib/larsa.o -c -ffree-form -g -J./build/lib lib/larsa.f
lib/larsa.f:1569.51:
Call splits_str_to_str (s, delim, t1, t2, t3, t4, &
1
Error: Type mismatch in argument 's2' at (1); passed CLASS(*) to CHARACTER(1)
lib/larsa.f:1572.51:
Call splits_str_to_str (s, delim, t1, t2, t3, t4, &
1
Error: Type mismatch in argument 's2' at (1); passed CLASS(*) to CHARACTER(1)
lib/larsa.f:1575.51:
答案 0 :(得分:2)
这只是SELECT TYPE的语法规则和约束的结果。
从概念上讲,类型选择仅限于对象的动态类型以及该类型的任何种类参数。不基于长度类型参数选择要执行的块,因此语法要求假定长度类型参数的规范。
所以你只想要:
TYPE IS (CHARACTER(*))
如果没有假设的规范,语法的含义就是选择器的长度类型参数必须匹配字符类型的该参数的默认值,即1.
答案 1 :(得分:2)
除了IanH解释的语法问题之外 - 你必须在选择类型中使用character(*)
- 我会在第二个问题中添加一些内容。可能这应该是一个新问题。
您不能假设您知道两个对象具有相同的动态类型。您必须在select type
中将所有这些列为选择器,否则未列出的那些将保持多态。这与select type
使用t1
的原因完全相同。
我还会宣传您的例程splits_str_to_str
似乎接受可选参数。在这种情况下,您不必测试所有这些的礼物,即使不存在,您也可以将它们作为可选的实际参数传递。
不幸的是,要在select type
中使用它们作为选择器,您仍需要测试它们的存在。
还有一个重要的设计问题。为什么没有splits
character
伪参数?为什么它需要无限多态?