如何解决Fortran DATA 语句中的字符串连接
我想使用 DATA 语句定义一些长度为两个字符的变量,直接在 DATA 语句中连接两个引用单个字符的命名常量。
有可能吗?如果是这样,正确的语法是什么?有没有更好、更简洁的方法来做到这一点?
示例
use m_ascii_chars ! this defines ch_* stuff as single character named constants
...
character(2) :: pairs(100)
...
DATA pair(1) / ch_plus // ch_verticalbar / ! would be the best one,but it does not work,! given the meaning of the slash in the DATA
! statement
DATA pair(1) / ( ch_plus // ch_verticalbar ) / ! does not work !!
DATA pair(1) / [ ch_plus // ch_verticalbar ] / ! does not work !!
! This works,but it is rather verbose
DATA pair(1)(1:1) / ch_plus /
DATA pair(1)(2:2) / ch_verticalbar /
...
! Of course,this works too,but does not fit the requirements.
DATA pair(1) / '+|' /
解决方法
字符串联不能出现在 data
语句的值中。就问题而言,初始化变量的值必须是常量。 '+' // '|'
是一个常量表达式,但不是一个常量。声明
DATA pair(1) / '+|' /
如前所述很好,因为 '+|'
是一个(文字)常量。可以类似地使用具有该值的命名常量,并且可以在命名常量的初始化表达式中使用(常量的)字符连接:
character(*),parameter :: plusbar = ch_plus//ch_verticalbar
data pair(1) / plusbar /
正如所见,
DATA pair(1)(1:1) / ch_plus /
DATA pair(1)(2:2) / ch_verticalbar /
有效。虽然冗长,但可以(稍微)更简洁地编写:
DATA pair(1)(1:1),pair(1)(2:2) / ch_plus,ch_verticalbar /
您的编译器可能支持对子字符串进行隐含操作,但这是非标准的。
如果您想分块提供初始值,那么您会被 data
语句卡住,这里不能使用字符串连接。但是,如果您能够为整个数组提供表达式,则可以使用连接:
character(2) :: pair(100) = [ch_plus//ch_verticalbar,...]
这样的表达式可能很麻烦,但您可以使用 building up this array 的各种技术。
'+'//'|'
的困难不在于 //
与分隔符的 /
的解析冲突。类似的限制适用于其他表达式,例如不允许具有
integer i
data i /1+2/
(当然值列表中的 3*2
表示 2,2,2
不是 6
)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。