2012-02-24 3 views
1

다음 코드는 Linux 시스템에서 pgf90으로 컴파일 할 때 세그먼트 화 오류를 발생시키는 반면, Windows에서 Intel Visual FORTRAN을 사용하면 성공적으로 실행됩니다.Fortran에서 서브 루틴 호출 (세그먼트 오류)

program main 
implicit none 
integer:: a(3), b(3) ,c(3) 
a=[3, 4, 5] 
b=[1, 2, 3] 
call sub(a,b,c) 
write(*,*)'a+b = ',c 
end program main 

subroutine sub(a,b,c) 
implicit none 
integer, intent(in)::a(:),b(:) 
integer, intent(out)::c(:) 
c=a+b 
end subroutine sub 

설명이 있으십니까?

+0

정수 :: a (3), b (3), c (6)? –

+0

segfault는 어디에서 발생합니까? 모듈을 사용할 수 있습니까? – haraldkl

+0

@JulienMay : 나는 그렇게 생각하지 않는다. 크기가 3 인 배열 두 개를 추가하면 크기가 6이 아닌 크기가 3 인 배열이 반환됩니다. – eriktous

답변

3

셰이프 임시 인수를 가정하는 서브 루틴을 호출하면 (이 프로그램 에서처럼) 명시 적 인터페이스가 필요합니다. 이것을 달성하는 가장 쉬운 방법은 서브 루틴을 모듈에 넣고 주 프로그램에서 모듈을 사용하는 것입니다.

+0

Thanks Julien May, integer :: a (3), b (3), c (6)을 사용하면 올바르게 작동합니다. 그리고 @ eriktous 현재 세그먼트 분할 오류를 방지하기 위해 모듈 방법을 사용했으나이를 위해 모듈 또는 인터페이스를 사용하는 것이 좋습니다. –

+0

예를 들어이 비슷한 질문보기 : http://stackoverflow.com/questions/9374691/array-and-pointer-shapes –

+0

Thanks @ M.S.B. 하지만 당신은 인터페이스와 모듈 옵션 사이에 제안합니까? 현재 모듈을 사용 했으므로 인터페이스를 사용할 필요가 있습니까? –

1

배열을 선언하고 초기화하는 방법에 표준 Fortran 90 구문을 사용하면 도움이 될 수 있습니다.

program main 
implicit none 
integer, dimension(3):: a, b ,c 
a=(/3, 4, 5/) 
b=(/1, 2, 3 /) 
call sub(a,b,c) 
write(*,*)'a+b = ',c 
end program main 
관련 문제