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

发布于 2024-12-19 22:10:57 字数 958 浏览 3 评论 0原文

我无法在 Linux 环境下使用 pgf90 fortran 编译器调用同一子例程两次。第一次调用该子程序没问题,但第二次调用它时,就会出现分段错误。有人可以给我一些建议吗,我的代码有什么问题,作为简单的例子,用

gfortran 给出 PS 就可以了,即使我在 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

I can not call the same subroutine two time using pgf90 fortran complier on Linux environment. To call the subroutine for the 1st time is OK but calling it for the 2nd time, it gives Segmentation fault. Can some one give some suggestion, what is wrong with my code, As simple example is given as

P.S. with gfortran it is OK, even i tried it on the intel visual fortran and it is OK

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

罪歌 2024-12-26 22:10:57

说实话,当你第一次调用它时,我很惊讶它竟然能起作用。这是因为 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 之前使用它。

您是否认为这是一个零大小的数组感到困惑?好吧,您需要将其从头脑中清除 - 未分配的可分配数组根本没有定义的大小,这与已分配的零大小数组非常不同。

伊恩

To be honest I'm amazed it works the first time you call it. That's because A is not then allocated, and you are not allowed to use the size intrinsic on an unallocated allocatable array. In fact if you turn on all the checking flags ifort tells you this

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 is less clear, but still tells you something is wrong

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]

And to pick another random compiler, that from Sun/oracle, again you get the same message

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

So the problem is the use of A before it is allocated.

Is the confusion that you think this is a zero size array? Well you need to get that out of your head - an unallocated alloctable array has no defined size at all, which is very different from allocated bu zero size array.

Ian

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文