使用Fortran 77子例程进行无效的内存访问

时间:2015-02-20 16:45:49

标签: arrays memory fortran fortran90 fortran77

与fortran 77子程序交互会导致"无效的内存访问"我在下面总结的代码错误:

subroutine mysub1()
    parameter :: kk=22
    real, dimension(KK) :: A
    call F77SUB(A)
end

subroutine mysub2()
    parameter, integer :: kk=22
    real, dimension(:,:), allocatable :: A
    integer :: jj

    jj = 12
    allocate(A(kk,jj))

    call F77SUB(A(:,1)) ! ERROR: Invalid memory access
end

其中F77SUB是我试图使用的fortran子程序,它采用一维数组并写入它。在上面的代码中,mysub1有效但mysub2没有。

有人可以提出上面的问题,或者提供有关如何在F90和F77子程序之间实际传递数组参数的详细信息吗?我已经看到标量的实例被传递给F77子程序,这显然只是将标量的内存地址作为数组的开头。任何启蒙都会受到赞赏。

2 个答案:

答案 0 :(得分:1)

评论太长了,但答案不太明确..

您发布的代码是crazee,尝试修复汇总代码是一项徒劳无功的任务,因此我不会花很长时间。以下是一些令人震惊的错误,请不要回答告诉我们您的“真实”代码中缺少错误。

  1. F77SUB(A(:,1))在调用子例程时语法错误,call F77SUB(A(:,1))是正确的。
  2. 不建议分配未声明为可分配的数组。
  3. 非常值得推荐使用明确intent的过程参数。
  4. 您在Fortran 90和FORTRAN77例程之间划分的二分法具有误导性。如果您的编译器可以编译Fortran 90(并且它必须能够或者您没有任何可分配的东西)那么您最好将您的代码视为普通的Fortran。

答案 1 :(得分:0)

我发现了问题。我宣称1D A是双精度而2D A是真实的。不知怎的,它让我把它们都传递给了F77例程而没有抱怨。