首页 > 解决方案 > 如何使用数据在 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$ NOFREEFORMgfortran 似乎无法识别属性。

标签: fortran

解决方案


这更像是一个扩展评论——一旦得到正确的答案就会删除,或者在我弄清楚我目前不理解的细节后进行编辑。

我无法在 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 编译


推荐阅读