我们应该在Fortran的整个数组操作之前检查数组的形状吗?

时间:2017-10-05 23:44:41

标签: arrays matrix fortran

我想问一个关于Fortran中矩阵乘法错误处理的一般问题。

假设以下代码

MODULE MatMulTest
  IMPLICIT NONE
  CONTAINS
      SUBROUTINE C_EQ_AB( A, B, C )
          REAL, DIMENSION( :, : ), INTENT( IN ) :: A, B
          REAL, DIMENSION( :, : ), INTENT( OUT ) :: C

          C = MATMUL( A, B )

      END SUBROUTINE C_EQ_AB
END MODULE MatMulTest

PROGRAM MAIN
  USE MatMulTest
  IMPLICIT NONE
  REAL, DIMENSION( 3, 2 ) :: B, C
  REAL, DIMENSION( 2, 2 ) :: A

  CALL C_EQ_AB( A, B, C )

END PROGRAM MAIN

现在主程序在概念上是错误的,因为我们将(2,2)数组乘以(3,2)数组。程序产生的错误是

Fortran runtime error: dimension of array B incorrect in MATMUL intrinsic

Error termination. Backtrace:
#0  0x10b5696a9
#1  0x10b56a365
#2  0x10b56a63a
#3  0x10b5f2bab
#4  0x10b563d27
#5  0x10b563e7d
#6  0x10b563eb6

从这个错误信息我们找不到(或者我们可以吗?)发生错误的地方(假设有很多子程序执行矩阵乘法。)那么我们是否应该检查数组的边界或形状?如果是,那么对于计算速度有什么影响,因为有许多子程序执行矩阵乘法?有没有有效的方法来处理矩阵乘法错误?

2 个答案:

答案 0 :(得分:1)

您获得的信息取决于您的编译器,不同的编译器将为您提供不同的诊断。

在gfortran中,您将获得有关哪个尺寸不符合以及左侧和右侧的形状的信息。

要了解它发生在哪里,你就得到了回溯。但是你只有一些地址,你不知道他们指向哪里。您必须使用-g等编译器选项编译代码。请参阅编译器手册。然后你将获得文件名和行号而不是内存中的地址。

你应该经常检查阵列形状吗?通常不是。通常,您可以设置代码,以便通过程序中较早的某个位置和正确的程序设计不会发生此类不符合。如果它确实发生了由于一个错误你去找到并修复错误。你可以临时检查这个错误。

答案 1 :(得分:0)

对于生产代码可能不...

但是!我经常使用D-lines并使用编译器开关-fixed来获得开发代码,可以在没有D-line的情况下重新编译。

有时候进行检查是值得的,所以我建议你试试它,看看你喜欢它。