fortran - 如何使用数据在 fortran 模块中初始化 var
问题描述
我有一个用 f90 编写的模块和一些旧的初始化数据代码:
module example
implicit none
integer a
! my legacy data init value
!DEC$ NOFREEFORM
data a /1/
!DEC$ FREEFORM
end module example
它编译好,但在运行时,数据语句似乎不起作用, vara
的值是 0 而不是 1。
将遗留数据语句插入我的 f90 代码的正确方法是什么?
program main
use example
print *, a
end program main
在这种情况下,如果我删除该!DEC$
行,我将得到 1 的输出。
但是我在实际项目中有大量遗留代码,并且不想将 f77 代码升级到 f90。
我的编译器是 windows 上的 intel fortran 2013。
更新
数据前的空格号错误。复制粘贴后变为 5,但实际上这里的语法需要 6 个空格。
但英特尔 fortran 不会在此处引发任何语法错误。
手动添加空格后,示例代码有效。
顺便说一句,该代码适用于 gfrotran 只是因为!DEC$ NOFREEFORM
gfortran 似乎无法识别属性。
解决方案
这更像是一个扩展评论——一旦得到正确的答案就会删除,或者在我弄清楚我目前不理解的细节后进行编辑。
我无法在 Windows 上访问 intel fortran 2013。但是我确实可以访问
[ijb@login12(arcus-b) stack]$ ifort --version
ifort (IFORT) 14.0.2 20140120
Copyright (C) 1985-2014 Intel Corporation. All rights reserved.
我相信这是等效的linux版本。用你的原始代码试试这个我得到
[ijb@login12(arcus-b) stack]$ cat data.f90
module example
implicit none
integer a
! my legacy data init value
!DEC$ NOFREEFORM
data a /1/
!DEC$ FREEFORM
end module example
program main
use example
print *, a
end program main
[ijb@login12(arcus-b) stack]$ ifort --version
ifort (IFORT) 14.0.2 20140120
Copyright (C) 1985-2014 Intel Corporation. All rights reserved.
[ijb@login12(arcus-b) stack]$ ifort data.f90
data.f90(9): remark #5082: Directive ignored - Syntax error, found IDENTIFIER 'ATAA' when expecting one of: <END-OF-STATEMENT> ;
data a /1/
------^
[ijb@login12(arcus-b) stack]$
发生这种情况是因为您没有为固定格式 Fortran 缩进足够的数据语句 - 它应该缩进到第 7 列,但您只将它缩进到第 6 列。因此,它将字母d
视为延续标记而不是一部分的data
,所以变得非常困惑。
如果我更正此代码,则代码按预期工作:
[ijb@login12(arcus-b) stack]$ cat data.f90
module example
implicit none
integer a
! my legacy data init value
!DEC$ NOFREEFORM
C234567
data a /1/
!DEC$ FREEFORM
end module example
program main
use example
print *, a
end program main
[ijb@login12(arcus-b) stack]$ ifort --version
ifort (IFORT) 14.0.2 20140120
Copyright (C) 1985-2014 Intel Corporation. All rights reserved.
[ijb@login12(arcus-b) stack]$ ifort data.f90
[ijb@login12(arcus-b) stack]$ ./a.out
1
[ijb@login12(arcus-b) stack]$
现在 gfortran 可以工作,因为它忽略了编译器指令,并且最初编写的数据语句是完全有效的自由格式 Fortran。我不明白的是为什么它在 Windows 下用 ifort 2013 编译
推荐阅读
- r - 在多列的 R 中挑战 group by
- javascript - Billboardjs 图表比它的容器大
- android - 未能解决所有 Google 依赖项
- regex - 无法理解正则表达式中的匹配
- java - 如何使用 selenium webdriver 配置网页语言
- visual-studio - 手动使用 TFS 控制部分创建 VS2015 解决方案文件时出现问题
- android - Dagger 2 将子组件添加到父组件
- r - 在自定义函数中将列名传递给 group_by 和 ggplot2
- android - 滚动而不添加图像时 RecylerView 滞后
- javascript - 如果 UL LI 中不存在类,则显示元素