【问题标题】:Fortran not giving error on array assignmentFortran 没有给出数组赋值错误
【发布时间】:2015-12-21 13:57:23
【问题描述】:

我这里有一些测试代码并没有像我想象的那样运行。我正在使用 gfortran 编译器。

program test
implicit none

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

allocate(a(2))
allocate(b(4))

a = 1
b = 2
write(*,*) a
write(*,*) ' '
write(*,*) b
write(*,*) ' '
write(*,*) 'a size before', size(a)

a = b
a = 1

write(*,*) a
write(*,*) ' '
write(*,*) b
write(*,*) ' '
write(*,*) 'a size after', size(a) 
end program test

我得到以下输出。

1 1

2 2 2 2

2 之前的尺寸

1 1 1 1

2 2 2 2

4 后的大小

为什么在分配不同维度的数组时不会出错? 为什么a的大小变了?

【问题讨论】:

  • 我可以用gfortran 4.8.4 版重现这种行为(除了“a size after”是 8,而不是 4)。我曾尝试使用-fcheck=bounds,但即使这样也没有用。对我来说看起来像是一个编译器错误。
  • 有趣,我正在使用 gfortran test.f95 -o test.out 进行编译。如果是这种情况,应该有人雇用我来寻找错误,我似乎总是遇到它们。
  • 8 是正确的答案。或者我错过了什么?

标签: arrays dynamic fortran size variable-assignment


【解决方案1】:

这是一个名为allocation on assignment 的功能。将数组分配给可分配数组时,它会自动调整大小。所以在a = b之后,a的大小应该是b

您可以通过-Wrealloc-lhs 选项告诉编译器对此发出警告。

另见此人条目:

-frealloc-lhs

内在赋值的可分配左侧是 自动(重新)分配,如果它要么未分配或有 不同的形状。该选项默认启用,除非 -std=f95 已给出。另见-Wrealloc-lhs

另请参阅 Steve Lionel 的相关博客条目 Doctor, it hurts when I do this

【讨论】:

  • a(:) 和 -std=f95 似乎并不能阻止使用 gfortran 进行重新分配。
  • 哦等等,它确实将 a 的大小保持为 2,只是没有警告,即使使用 -Wrealloc-lhs
  • @KierenAnderson 对我有用,但要获得运行时错误,它需要激活边界检查:-fbounds-check。没有它,a 的大小仍然是 2。使用边界检查和 -std=f95 它会失败。
  • @KierenAnderson 和 -std=f95 它不会进行重新分配,因此不会发出警告。但它也不检查数组的边界,所以只检查赋值(错误地)。
  • @KierenAnderson 请在问题中更正
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-06
  • 2011-05-06
  • 2019-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多