0

Linux環境でpgf90fortrancomplierを使用して、同じサブルーチンを2回呼び出すことはできません。サブルーチンを1回呼び出すことは問題ありませんが、2回目に呼び出すと、セグメンテーション違反が発生します。誰かが私のコードの何が問題なのか、いくつかの提案をすることができますか?簡単な例は次のように与えられます

PS with gfortranはOKですが、IntelVisualFortranで試してみても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
4

1 に答える 1

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 の使用です。

これがゼロサイズの配列だと思うのは混乱ですか?頭からそれを取り除く必要があります-割り当てられていない割り当て可能な配列には定義されたサイズがまったくありません。これは、割り当てられたbuゼロサイズの配列とは大きく異なります。

イアン

于 2011-12-07T15:54:39.017 に答える