【问题标题】:Fortran entries of array change seemingly at random数组的 Fortran 条目看似随机变化
【发布时间】:2016-07-07 03:56:42
【问题描述】:

我一直在使用 FORTRAN 程序。我注意到我正在使用的一维矩阵中看似随机的变化。它是一个由 4000 个整数组成的矩阵。值被一个一个地添加到矩阵中,从索引 1 开始,并为每个添加的值迭代 1。矩阵没有完全“填充”,目前只有 100 个值放入矩阵中。所以人们会期望矩阵的前 100 个条目不为零(所有相加的值都非零),其余 3900 个条目将为 0。但是,矩阵的一些条目最终是大负数,但我确信我的代码没有任何部分涉及这些条目。

什么可能导致此问题?很抱歉,我无法发布代码供大家使用。

该代码还有其他几个大型矩阵,总共占用了大约 100 MB 的空间。这可能是内存问题吗?

谢谢!

【问题讨论】:

    标签: memory fortran gfortran


    【解决方案1】:

    你必须初始化你的数组,否则它几乎总是包含垃圾。这样就可以了:

    array = 0.0e0  ! real array
    

    array = 0.0e0  ! double precision
    

    array = 0  ! integer
    

    【讨论】:

    • 这也许是要注意两点。在 Fortran 中,“初始化”是指特定的东西,而不是显示的赋值。您可能不会将 0.0e0 表示为双精度(并且对于每个示例,都有可用的类型转换)。
    • 您可以使用= 0 来初始化(定义)任何 Fortran 数值类型变量。小整数是完全可表示的。
    【解决方案2】:

    “矩阵”是二维的;你的数组是一维的。

    除非你要求他们改变,否则事情不会改变。

    FORTRAN 不会初始化标记为 COMMON 中的变量(我记得)。因此,它们保证从垃圾值开始。尝试使用 DATA 语句初始化数据。如果你必须初始化一个带标签的 COMMON,你必须提供一个 BLOCK DATA 子程序。

    【讨论】:

    • 谢谢!这似乎已经解决了这个问题。
    • 无需使用通用块和数据语句,可以在声明中初始化变量如integer :: arr(10,10) = 0。
    • 对,要清楚,我通过初始化 X(:) = 0 解决了这个问题
    • 您的步幅表达不是必需的。 x=0 应该可以完成这项工作。
    • 这个答案是错误的。通常,fortran 编译器不会初始化任何东西。它可以被标记到编译器,但在代码中这样做肯定更安全。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-25
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    • 1970-01-01
    相关资源
    最近更新 更多