我无法在Linux环境下使用pgf90 fortran编译器两次调用相同的子程序。第一次调用子程序是可以的但是第二次调用它会产生分段错误。有人可以提出一些建议,我的代码有什么问题,简单的例子是
P.S。与gfortran一起,没关系,即使我在intel visual fortran上试过它也没问题
program main
use module_Append_1DI
implicit none
integer, allocatable:: Arr(:)
integer::Brr(2)
Brr=[3, 4]
call Append_1DI(Arr,Brr)
write(*,*)Arr
call Append_1DI(Arr,Brr)
write(*,*)Arr
end program main
module module_Append_1DI
contains
subroutine Append_1DI(A,B)
implicit none
!================================================
integer, allocatable, intent(inout)::A(:)
integer, intent(in)::B(:)
integer, allocatable::temp(:)
integer::sizeA,sizeB,sizeN
!================================================
sizeA=size(A); sizeB=size(B); sizeN=sizeA+sizeB
allocate(temp(sizeN)); temp(1:sizeA)=A
call move_alloc(from=temp,to=A)
A(sizeA+1:sizeN)=B
end subroutine Append_1DI
end module module_Append_1DI
答案 0 :(得分:4)
说实话,我很惊讶它在您第一次打电话时起作用。那是因为A不会被分配,并且不允许在未分配的可分配数组上使用内在大小。事实上,如果你打开所有的检查标志ifort告诉你这个
Wot now? ifort --version
ifort (IFORT) 12.0.4 20110427
Copyright (C) 1985-2011 Intel Corporation. All rights reserved.
Wot now? ifort -check all -g -traceback s.f90
Wot now? ./a.out
forrtl: severe (408): fort: (8): Attempt to fetch from allocatable variable A when it is not allocated
Image PC Routine Line Source
a.out 000000000046A3FA Unknown Unknown Unknown
a.out 0000000000468F75 Unknown Unknown Unknown
a.out 0000000000420B56 Unknown Unknown Unknown
a.out 0000000000404C95 Unknown Unknown Unknown
a.out 00000000004050E9 Unknown Unknown Unknown
a.out 0000000000402ED5 module_append_1di 24 s.f90
a.out 000000000040385F MAIN__ 46 s.f90
a.out 0000000000402B2C Unknown Unknown Unknown
libc.so.6 00007FB5F826DEFF Unknown Unknown Unknown
a.out 0000000000402A29 Unknown Unknown Unknown
gfortran不太清楚,但仍然告诉你一些错误
Wot now? gfortran --version
GNU Fortran (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2
Copyright (C) 2010 Free Software Foundation, Inc.
GNU Fortran comes with NO WARRANTY, to the extent permitted by law.
You may redistribute copies of GNU Fortran
under the terms of the GNU General Public License.
For more information about these matters, see the file named COPYING
Wot now? gfortran -Wall -Wextra -pedantic -fbounds-check -std=f2003 -g -fbacktrace s.f90
Wot now? ./a.out
At line 24 of file s.f90
Fortran runtime error: Array bound mismatch for dimension 1 of array 'temp' (1252015568/139957056323024)
Backtrace for this error:
+ function append_1di (0x400EC7)
at line 24 of file s.f90
+ in the main program
at line 48 of file s.f90
+ /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xff) [0x7f4a4a1deeff]
要从Sun / oracle中选择另一个随机编译器,再次得到相同的消息
Wot now? f90 -V
f90: Sun Fortran 95 8.5 Linux_i386 2010/08/13
usage: f90 [ options ] files. Use 'f90 -flags' for details
Wot now? f90 -C s.f90
Wot now? ./a.out
****** FORTRAN RUN-TIME SYSTEM ******
Attempting to use an unallocated ALLOCATABLE 'A'
Location: line 22 column 16 of 's.f90'
Aborted
所以问题是在分配A之前使用A.
您认为这是一个零大小的数组是否存在混淆?那么你需要从头脑中解决这个问题 - 一个未分配的可分配数组根本没有定义的大小,这与分配的零大小数组非常不同。
伊恩