Fortran类型是(字符)

时间:2014-12-10 02:31:11

标签: fortran

尝试使用时出现以下错误 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:

2 个答案:

答案 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伪参数?为什么它需要无限多态?