Fortran 变量被改变
Fortran variable being altered
我目前正在用 Fortran 编写特征值算法。我只是想深入了解我遇到的问题的原因。我跟踪了这个问题,但我想知道这些问题是如何相关的。
具体来说,我按如下方式对 LAPACK 进行了一系列调用
call DGEMV('T', ROWS, COLUMNS, 1.0_dp, updates(j,k), LEADING_DIM, v, 1, 0.0_dp, w, 1)
call DGER(ROWS, COLUMNS, -2.0_dp, v, 1, w, 1, updates(j,k), LEADING_DIM)
问题是开始子矩阵运算的索引 j 和 k 不正确。上面的代码执行后,并没有报错——即使开启了边界检查。但是,作为 'intent(in)' 正确传递的完全不相关的变量被更改了。更正索引后,问题不再发生。
当您越界访问数组时,任何事情都可能发生。您写入内存的某个未知部分,这可能会触发其他随机错误。
该程序不符合标准,其行为未定义。你不能指望什么。
我目前正在用 Fortran 编写特征值算法。我只是想深入了解我遇到的问题的原因。我跟踪了这个问题,但我想知道这些问题是如何相关的。
具体来说,我按如下方式对 LAPACK 进行了一系列调用
call DGEMV('T', ROWS, COLUMNS, 1.0_dp, updates(j,k), LEADING_DIM, v, 1, 0.0_dp, w, 1)
call DGER(ROWS, COLUMNS, -2.0_dp, v, 1, w, 1, updates(j,k), LEADING_DIM)
问题是开始子矩阵运算的索引 j 和 k 不正确。上面的代码执行后,并没有报错——即使开启了边界检查。但是,作为 'intent(in)' 正确传递的完全不相关的变量被更改了。更正索引后,问题不再发生。
当您越界访问数组时,任何事情都可能发生。您写入内存的某个未知部分,这可能会触发其他随机错误。
该程序不符合标准,其行为未定义。你不能指望什么。