2011-12-07 2 views
0

Linux 환경에서 pgf90 fortran 컴파일러를 사용하여 동일한 서브 루틴을 두 번 호출 할 수 없습니다. 첫 번째 시간 동안 서브 루틴을 호출하는 것은 괜찮지 만 두 번째 시간 동안 호출하면 세그멘테이션 오류가 발생합니다. 어떤 사람이 내 코드에 어떤 문제가 있는지 제안 할 수 있습니까? 간단한 예제는 다음과 같습니다.리눅스에서 pgf90 컴파일러에서 두 번째 서브 루틴을 호출 할 때 세그먼트 화 오류가 발생했습니다.

P. 이 OK입니다 gfortran으로, 심지어는 인텔 비주얼 포트란에 그것을 시도하고 나는 그것이 당신이 전화를 처음 작동 놀라 울뿐입니다 솔직히

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

OK입니다. 그 이유는 A가 할당되지 않았기 때문에 할당되지 않은 할당 가능 배열에서 크기 intrinsic을 사용할 수 없기 때문입니다. 이

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 덜 분명하다 알려줍니다 ifort 모든 검사 플래그를 설정하지만, 여전히 뭔가를 알 경우에 실제로 있는지,

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] 

그리고 또 다른 임의의 컴파일러를 선택하는 잘못된 일에서/오라클, 다시 같은 메시지가 나타납니다.

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 제로 크기 배열과 매우 다릅니다.

이안

+0

는 상세 응답을, 대단히 이안 감사드립니다. 나는 나의 실수가 무엇인지 지금 이해할 수있다. –

관련 문제