【问题标题】:String concatenation in Fortran DATA statementFortran DATA 语句中的字符串连接
【发布时间】:2021-02-02 10:51:32
【问题描述】:

我想使用 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 语句不是我的习惯,我很乐意避免使用它(如我问题的最后一部分)。是的,编译器会根据我使用的(错误的)语法发出不同的错误消息(不值得报告)。我不想定义一个大的初始化数组,我只想使用命名常量来定义每个元素。假设: ` 整数,参数 :: PLUS_VERTICALBAR = 1 ... pair(PLUS_VERTICALBAR) = ch_plus // ch_verticalbar ... ` 我可能会在初始化过程中这样做,但我想在编译时这样做 *as使用 DATA 状态)
  • @francescalus 是的,在示例中,我在变量数组对上使用了 DATA。将对定义为参数(使用不同的语法)会更好。

标签: fortran initialization string-concatenation


【解决方案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)

【讨论】:

  • 感谢您的扩展和非常有用的回答。
猜你喜欢
  • 2016-06-18
  • 1970-01-01
  • 2011-11-12
  • 1970-01-01
  • 1970-01-01
  • 2016-06-23
  • 1970-01-01
  • 2021-12-18
  • 2023-03-23
相关资源
最近更新 更多