有没有一种方法可以在Fortran的代码文件中包含数据?

有没有一种方法可以在Fortran的代码文件中包含数据?,fortran,Fortran,我的Fortran代码需要从文件中读取初始化数据(大约24000个实数)。有没有办法将数据放入代码中,这样我就可以避免访问文件系统 我尝试使用一个模块,将所有数据放入变量初始化中,如下所示: real(kind=8) :: a(24000)=(/& & 1. ,& & 2. ,& ... &/) 但由于源文件有24000行,我一直收到编译错误“太多的续行”。有什么解决办法吗?您可以使用语句来解决这个问题 您可以将数组“切片”为多个部分(

我的Fortran代码需要从文件中读取初始化数据(大约24000个实数)。有没有办法将数据放入代码中,这样我就可以避免访问文件系统

我尝试使用一个模块,将所有数据放入变量初始化中,如下所示:

 real(kind=8) :: a(24000)=(/&
 & 1. ,&
 & 2. ,&
 ...
 &/)
但由于源文件有24000行,我一直收到编译错误“太多的续行”。有什么解决办法吗?

您可以使用语句来解决这个问题

您可以将数组“切片”为多个部分(例如在一个部分中设置
a[1..100]
,在下一个部分中设置
a[101..200]
,等等),这意味着您应该能够避免遇到的大量语句大小问题。

您可以使用语句来解决这个问题


您可以将数组“切片”为多个部分(例如在一个部分中设置
a[1..100]
,在下一个部分中设置
a[101..200]
,等等),这意味着您应该能够避免遇到的大量语句大小问题。

正如前一位作者所述,您可以使用data语句,但手动将其输入代码可能会很耗时。您担心在do循环中使用READ语句读取文件有什么原因吗?如果您可以向我们提供有关数据文件格式的任何输入,我们可以更好地帮助您。

如前一位作者所述,您可以使用data语句,但手动将其输入代码可能会很耗时。您担心在do循环中使用READ语句读取文件有什么原因吗?如果您能为我们提供有关数据文件格式的任何输入,我们可以更好地帮助您。

对于如此大量的数据,我会使用一些脚本语言(甚至Fortran)生成一段简单的Fortran代码,如

a(1) = ..
a(2) = ..
a(3) = ..

然后可以将这些代码复制粘贴或包含到源代码中。

对于如此大量的数据,我会使用一些脚本语言(甚至Fortran)生成一段简单的Fortran代码,如

a(1) = ..
a(2) = ..
a(3) = ..

然后可以将此代码复制粘贴到源代码中或将-d包含到源代码中。

它可能看起来有些过时,但您可以使用。您需要修改您的数据文件以获得您提供的表单

real(8), dimension(24000) :: a=(/1.0,2.0,...24000./)
然后
将其包含在主程序中,如下所示:

program main
   implicit none
   include "my_data_file.for"

   < ... >
end program main
主程序
隐式无
包括“my_data_file.for”
< ... >
主程序结束

您无需更改编译命令,Fortran编译器将自行导入
include
d文件——只要包含的文件位于同一目录中。

它可能看起来是过时的,但您可以使用。您需要修改您的数据文件以获得您提供的表单

real(8), dimension(24000) :: a=(/1.0,2.0,...24000./)
然后
将其包含在主程序中,如下所示:

program main
   implicit none
   include "my_data_file.for"

   < ... >
end program main
主程序
隐式无
包括“my_data_file.for”
< ... >
主程序结束

您无需更改编译命令,Fortran编译器将自行导入
include
d文件——只要包含的文件位于同一目录中。

一个选项可能是指示编译器允许无限行长度 把这该死的东西放在一条线上

gfortran -ffree-line-length-none
我已经证实了这一点。我有一个2Mb的源文件,只有3行

real(kind=8) :: a(24000)=(/ ......... /)
write(*,*)a(24000)
end
如果某些编译器有一个实用的行长度限制,我也不会感到惊讶

顺便说一句,gfortran不喜欢使用大的
data
语句。 没有错误它只是挂起(或需要很长时间)

//
想象一下,我的大
数据
版本在1.5小时后实际编译(并且运行良好)。为什么
数据
由编译器处理,与初始化赋值有如此大的不同,这是一个好问题。

一个选项可能是指示编译器允许无限的行长度 把这该死的东西放在一条线上

gfortran -ffree-line-length-none
我已经证实了这一点。我有一个2Mb的源文件,只有3行

real(kind=8) :: a(24000)=(/ ......... /)
write(*,*)a(24000)
end
如果某些编译器有一个实用的行长度限制,我也不会感到惊讶

顺便说一句,gfortran不喜欢使用大的
data
语句。 没有错误它只是挂起(或需要很长时间)

//
想象一下,我的大
数据
版本在1.5小时后实际编译(并且运行良好)。为什么
数据
由编译器处理,与初始化赋值有如此大的不同,这是一个好问题。

就个人而言,我不喜欢在源文件中存储大量数据;我认为解决问题的办法是将数据保存在文件中,并在程序启动时读取。为什么要避免访问文件系统?@HighPerformanceMark我也不喜欢在源文件中包含数据,这会使代码难以读取和维护。我正在尝试将一个Fortran子程序构建到一个动态库中,以便在其他地方使用它。我不知道是否可以在动态库中包含数据文件。如果可能的话,你能提供一些参考资料吗?谢谢。我并不认为这是个好主意,但gfortran编译并运行得很好。(10倍甚至更大!)有人知道标准对允许的连续行数有何规定吗?Fortran 2003将连续行数增加到255。Fortran 95是39。这是编译器需要支持的。他们可以支持更多。我也认为读取一个文件来获取这么多的数据更好。在Fortran代码中,您可以通过环境变量找到文件,这样文件就不必放在特定目录中,用户也不必在特定目录中运行程序。这意味着必须指导用户如何设置环境变量,或者在构建过程中创建环境变量;我认为解决问题的办法是将数据保存在文件中,并在程序运行时读取