我有一个我需要使用的子程序的第三方脚本。该子程序如下
Subroutine COpen(io, Name )
Character*(*) Name
Character*1023 NameIn, NameOut
NameIn = Trim(Name)//' '
Call Get_OrMakeFileName( NameIn, NameOut )
Open(io,file=NameOut,access="APPEND")
End
我不理解Character*(*) name
语法。不是简单地声明字符串变量的典型方法。 character :: name*4
*4
部分指定了字符数?任何人都可以解释这种替代语法的目的吗?它会产生什么样的物体?
答案 0 :(得分:2)
简而言之:character*(*)
声明一个假定长度的字符变量。
有许多方法可以声明字符变量的长度。一个,如问题代码中所示,是
character*1023 ...
其中一个文字常量跟在*
之后。相当于
character([len=]1023) ...
(len=
是可选的)。在这种情况下,长度不必是文字常量。
这两种形式声明了一个特定长度的变量。字符变量有两种其他形式的长度:
character([len=]*) ...
; character([len=]:) ...
。与character*1023
一样,假定和延迟长度声明可以用这种方式写出:
character*(*) ... ! Assumed length
character*(:) ... ! Deferred length
character*(1023) ... ! For completeness
嗯,“假设长度”是什么意思?
对于诸如Name
之类的伪参数,它的长度取自过程的实际参数的长度。对于character :: Name*4
,参数的长度为4,无论子例程的参数长度如何(只要它的长度至少为4)。当假人具有假定的长度时,如果参数的长度为12,则其长度为12,依此类推。
虽然不在问题中,但名为constant的字符也可以从定义表达式中假设其长度:
character*(*), parameter :: label='This long'
延期长度留给其他问题。