【问题标题】:is the DATA statement needed in modern Fortran?现代 Fortran 中需要 DATA 语句吗?
【发布时间】:2019-04-09 10:01:15
【问题描述】:

我有点了解 fortran 中 data 语句的行为。但是我不知道是否有任何情况是首选或应该避免的

【问题讨论】:

  • 您能否更具体地定义“首选”或“应避免”?事实上,这个问题可以被解读为寻求意见,例如“我不喜欢数据陈述,因为......”,这使得问题在这里跑题了。
  • 早期需要一些声明,但现在有更好的做事方式,它们只是标准的一部分,因为它们不是完全禁止使用的,并且因为返回- 便携性原因。不知道数据声明是不是其中之一。
  • 事实上,Fortran 标准包含一系列过时的功能,并且该标准的多个版本删除(删除)了一些特定功能。 DATA 语句在程序单元的声明部分使用时,不会过时。但是,即使是某些不在此列表中的功能,也有理由避免使用。但是 StackOverflow 不是讨论 Fortran 编程风格问题的地方,这些问题通常是基于意见和主观的。
  • 标题中的“推荐”二字确实有问题。这个网站根本不适合个人推荐,也没有官方风格指南,不同书籍的推荐往往不同。
  • 我认为这个问题非常接近主题,因为关于数据声明及其与“现代”特征的区别有很多有用的东西要说。更改标题可能会有所帮助。

标签: fortran fortran90 fortran77 obsolete


【解决方案1】:

我个人喜欢data 语句,因为它比普通赋值更清楚我的变量初始化。例如:

type gene
  character :: gene
  integer :: depth
  integer :: delta
end type

type(gene) :: pool(8)

! initializing in a data statement looks nicer in this case
data pool%gene  / '#', 'U', 'R',  '+',  '-',  '*',  '/',  '^'/
data pool%depth /  0 ,  0 ,  1 ,   2 ,   2 ,   2 ,   2 ,   2 /
data pool%delta /  1 ,  1 ,  0 ,  -1 ,  -1 ,  -1 ,  -1 ,  -1 /

【讨论】:

  • 我不太确定数据语句是否比pool%gene = ['#', 'U', 'R', '+', '-', '*', '/', '^'] 之类的相应分配更清晰。然而,数据语句给出显式初始化这一事实是一个重要的区别。 (如果您依赖于能够在无法进行赋值时使用更接近声明的数据语句,那将值得强调。)
  • 是的,法国人。也许我没有选择一个好的例子,因为在这种情况下,正常的赋值看起来几乎等于数据语句。也许一个更好的例子可能是初始化一个上三角矩阵或类似的东西,它作为数据语句比赋值要简单得多。
  • 我仍然不明白为什么在上三角矩阵初始化中使用数据比使用普通赋值更容易
【解决方案2】:

数据声明并未过时。但是,自 Fortran 95 以来,它在可执行语句中的使用已经过时。latest Fortran standard 的附录 B 提供了过时功能的详细信息。

B.3.5 可执行文件之间的 DATA 语句。语句排序 规则允许 DATA 语句出现在程序单元之后的任何位置 规范声明。定位数据的能力 可执行语句中的语句很少 使用过的、不必要的和潜在的错误来源。

在 Modern Fortran Explained 的第 140 页(2011 年的绿色版,而不是我没有的较新的红色版),Metcalf、Cohen 和 Reid 写道

我们建议使用类型声明语句而不是数据 声明,但数据声明必须在只有部分的情况下使用 一个变量将被初始化。

鉴于其中两位作者是 WG5 的成员(负责 Fortran 的开发 --- 实际上可能所有三位作者都是成员;我不确定 Michael Metcalf),我们可以这样说相当程度的确定性,除非在程序单元中的可执行语句之前初始化变量的一部分,否则应避免使用数据语句。

【讨论】:

    猜你喜欢
    • 2016-06-23
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    • 2011-02-23
    • 1970-01-01
    • 1970-01-01
    • 2013-06-08
    • 2017-06-04
    相关资源
    最近更新 更多