Fortran错误:spread()中的排名不匹配

时间:2018-06-15 16:14:12

标签: fortran gfortran

这是一个测试spread内在函数的简单代码:

program test_spread
   implicit none

   integer, allocatable, dimension(:) :: a
   integer, allocatable, dimension(:,:) :: b
   integer, allocatable, dimension(:,:,:) :: c
   integer, allocatable, dimension(:,:,:) :: d

   allocate(a(2), b(2,4), c(2,4,2), d(2,4,2))

   a(:) = [1, 2]
   print*, "a=", a

   b(:,:) = spread((a + 1)**2, 2, size(b,2))
   print*, "b=", b

   c(:,:,:) = spread(b, 3, size(c,3))
   print*, "c=", c

   d(:,:,:) = spread(spread((a + 1)**2, 2, size(d,2)), 3, size(d,3))
   print*, "d=", d
end program

使用gfortran 8.1.1编译:

gfortran -g -fcheck=all -Wall -Wtabs -fbacktrace -c test.f90
gfortran -g -fcheck=all -Wall -Wtabs -fbacktrace -o test_spread test.o

我得到以下结果:

 a=           1           2
 b=           4           9           4           9           4           9           4           9
 c=           4           9           4           9           4           9           4           9           4           9           4           9           4           9           4           9

Fortran runtime error: rank mismatch in spread()

Error termination. Backtrace:
#0  0x55b46b14386e in test_spread
    at /*****/test_spread/test.f90:20
#1  0x55b46b143966 in main
    at /*****/test_spread/test.f90:22

如果我删除allocatable属性,代码会编译并提供正确的结果。我做错了什么或是编译器错误?

代码使用英特尔Fortran 18编译并提供正确的结果。

PS:我正在使用英特尔(R)Xeon(R)Silver 4114 CPU在Arch Linux上使用GCC。

$ gfortran --version
GNU Fortran (GCC) 8.1.1 20180531
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

1 个答案:

答案 0 :(得分:3)

2018-06-01 Steven G. Kargl

    PR fortran/85816
    PR fortran/85975
    * libgfortran.h: Remove the GFC_DTYPE_COPY_SETRANK macro.
    * intrinsics/reshape_generic.c: Directly assign rank.
    * intrinsics/spread_generic.c: Ditto.
    ...
    * m4/spread.m4: Ditto.