fortran - 来自转置数组的源分配
问题描述
我试图了解我在代码中遇到的错误。当尝试使用数组的转置来分配数组时,我在代码中使用了带有 source=transpose(original_array) 的 allocate 语句。但是,使用这种方法我没有得到预期的结果。似乎索引关闭了一个,并且跳过了源数组的第一行。
例子:
program testalloc
real*8, allocatable :: a(:, :)
real*8, allocatable :: b(:, :)
allocate(b(2, 3))
b(1, :) = [1, 2, 3]
b(2, :) = [4, 5, 6]
call printmat(b)
a = transpose(b)
call printmat(a) ! Good
deallocate(a)
allocate(a(3, 2), source=transpose(b))
call printmat(a) ! Bad
deallocate(a)
allocate(a(3, 2))
a = transpose(b)
call printmat(a) ! Good
contains
subroutine printmat(mat)
real*8, intent(in) :: mat(:, :)
integer :: i
write(*,*) 'print'
do i = 1, size(mat, 1)
write(*,*) mat(i, :)
end do
end subroutine
end program
这使
print
5.0000000000000000 3.0000000000000000
6.0000000000000000 0.0000000000000000
3.2114266979681025E-322 5.0000000000000000
用于使用 gfortran(gcc 版本 7.3.0(Ubuntu 7.3.0-27ubuntu1~18.04))而不是转置的原始数组编译后的源分配。我在这里做错了什么还是编译器错误?
解决方案
来源分配
allocate(a(3, 2), source=transpose(b))
是一个有效的。为 指定的形状a
与源表达式的形状相同transpose(b)
。结果,a
取给定表达式的值。
编译器给出不同的结果是不正确的。这里不怪输出例程。
gfortran 8 似乎给出了预期的输出。
b
有趣的是,对于 gfortran 7,如果本身不可分配,则会出现预期结果。
推荐阅读
- windows - Microsoft Stack 是否始终与 16 字节对齐?
- docker - 使用 localhost 访问 DigitalOcean Docker droplet
- python - Python计算字符串的出现次数并打印包含它们的行,以及使用多个子句打印字符串的出现次数
- azure-devops - VSTS/Azure DevOps 中的 Jira 类型冲刺报告
- docker - 是否可以在 docker 中运行目标构建阶段而不运行所有先前的构建阶段
- android - 更改活动时应用程序崩溃。怎么办?
- c# - Net.Core 上带有 XSRF 的 Angular 6 CORS 不请求所有标头
- locking - 用整数互锁对象
- r - 使用 lpSolve 优化选择
- c++ - 为什么从另一个构造函数内部调用的 C++ 构造函数不修改类变量?