我们最近发现我们正在为Fortran中的未分配数组进行分配.GNU gfortran编译器没有捕获错误,代码在OSX和Linux下运行.但是,IBM Power PC上的代码分段错误相同.
我的问题是,以下代码是否正确?似乎分配给的数组array在某些体系结构上自动分配内存,但在其他体系结构上则不然.是否有实施具体细节在这里工作?
代码是混合的C/Fortran代码:
#include <stdlib.h>
void assign_array_(double x[], int* n);
void print_array_();
int main()
{
    int n,i;
    double *x;
    n = 5;
    x = (double*) malloc(sizeof(double)*n);
    for (i = 0; i < n; i++)
        x[i] = (double) i;
    assign_array_(x,&n);
    print_array_();
    return 0;
}
和Fortran代码:
MODULE test_mod
  DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:) :: array
  integer :: nsize
END MODULE test_mod
SUBROUTINE assign_array(x,n)
  USE test_mod
  IMPLICIT NONE
  INTEGER :: n
  DOUBLE PRECISION :: x(n)
  CALL test_allocated()
  array = …我正在尝试使用 fortran 2003 实现一个多项式类,其中包含重载的算术运算和赋值。派生类型维护术语定义和系数的可分配列表,如下所示
type polynomial
  private
    type(monomial),dimension(:),allocatable     ::  term
    double precision,dimension(:),allocatable   ::  coef
    integer                                     ::  nterms=0
  contains
   ...
end type polynomial
interface assignment(=)
   module procedure :: polynomial_assignment
end interface
   ...
contains
    elemental subroutine polyn_assignment(lhs,rhs)
      implicit none
      type(polynomial),intent(???)  :: lhs
      type(polynomial),intent(in)   :: rhs
 ...
我必须使它成为基本的,因为它旨在用作多项式矩阵。这确实有效,至少在大多数情况下是这样。然而,我不知何故让自己担心这里的自我分配。可以简单地检查指针以查看 C++ 中的内容是否相同,但它似乎不是 Fortran 中的一个选项。但是编译器确实检测到自赋值并给了我一个警告。(gfortran 4.9.0)
当我有lhs 的意图(输出)时, lhs 和 rhs 的可分配条目似乎在进入子例程时被释放,这是有道理的,因为它们都是 p,并且意图(输出)参数将首先被最终确定。
然后我尝试通过意图(inout)避免解除分配,并通过修改 lhs 输出中的一个字段来检查自分配
   elemental subroutine polyn_assignment(lhs,rhs)
      implicit none
      type(polynomial),intent(inout)  :: lhs
      type(polynomial),intent(in)   :: rhs
      lhs%nterms=rhs%nterms-5
      if(lhs%nterms==rhs%nterms)then
        lhs%nterms=rhs%nterms+5
        return
      end if
      lhs%nterms=rhs%nterms …