fortran - 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.
解决方案
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.
推荐阅读
- django - Django (DRF) & React - Forbidden (CSRF cookie not set)
- powershell - Powershell 在文本文件中搜索新内容
- powershell - 在 PowerShell 中处理 COM 事件
- vim - Vim 配色方案高亮问题
- python - Python 多处理 pool.map self._event.wait(timeout) 挂起。为什么 pool.map 等待没有响应?
- java - 在 tomcat 的单个 webapp 文件夹上托管多个域
- generics - 具有高阶功能的异常处理/抑制
- javascript - 如何根据javascript中的键合并和替换两个数组中的对象?
- arrays - Yii2 使用数组构建 activeform - 无法获取和回显第二个数组元素
- javascript - 查找字符串是否在 json 文件中,然后获取它周围的东西