linux - linux pgf90 编译器第二次调用子程序时出现段错误

标签 linux fortran fortran90 fortran77 fortran95

我无法在 Linux 环境中使用 pgf90 fortran 编译器调用同一个子程序两次。第一次调用该子程序是可以的,但第二次调用它时,它给出了 Segmentation fault。有人能给我一些建议吗,我的代码有什么问题,给出了一个简单的例子

附言使用 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

最佳答案

老实说,我很惊讶它在您第一次调用它时就起作用了。那是因为 A 然后没有分配,并且不允许在未分配的可分配数组上使用 size intrinsic。事实上,如果您打开所有检查标志,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。

您是否认为这是一个零大小的数组?好吧,您需要把它从头脑中弄清楚——未分配的可分配数组根本没有定义的大小,这与已分配的零大小数组有很大不同。

伊恩

关于linux - linux pgf90 编译器第二次调用子程序时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8417413/

相关文章:

linux - 使用 ubuntu snap 安装后 Flutter SDK 位置出现问题

c++ - 尝试将我的 C++ 可执行文件与 Fortran 库(Cygwin 环境)链接起来

module - Fortran 90编译问题: undefined reference to <modulename>

fortran - 如何根据用户输入变量(fortran90)执行多条语句?

Linux tcp 服务器无法绑定(bind)到 close_wait 端口

linux - Linux下与scilab的串口通信

linux - crontab node.js/socket.io

Fortran 调用函数时无限循环

fortran - 如何学习 Fortran。问题?

c++ - 在 C/C++ 应用程序中使用 Fortran90 模块