首页 > 解决方案 > Fortran 错误:spread() 中的排名不匹配

问题描述

这是一个测试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属性,代码将编译并给出正确的结果。我做错了什么还是编译器错误?

代码使用 Intel Fortran 18 编译并给出正确的结果。

PS:我在 Intel(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.

标签: fortrangfortran

解决方案


2018-06-01 史蒂文·G·卡格尔

    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.

推荐阅读