0
program bisect
real(8) :: output
call bisection(3.d0,4.d0,2.d0,output)
print*, output
end program bisect
subroutine bisection(a,b,error,result)
real(8):: a,b,error,c,result
logical:: proceed
proceed = .true.
do while (proceed)
if (sin(a)*sin(b).lt. 0.d0) then
c=(a+b)/2
if (sin(a)*sin(c).lt.0.d0) then
b=c
else
a=c
end if
else
stop 'cannot be bisected'
end if
if (abs(a-b).lt. error) then
proceed = .false.
end if
end do
result= a
end subroutine bisection
동일한 코드 버전이 here에 업로드됩니다.세그먼트 화 오류 - 포트란 90 - 이분법 서브 루틴
이것은 내가 생각해 낼 수있는 최소한의 예입니다. gfortran 및 웹 사이트에서 실행 파일을 실행하면 세그먼트 화 오류가 발생합니다.
서브 루틴은 인수를 변수로 취급하지 않습니까? 예를 들어 파이썬에서 비슷한 것을 사용할 수 있습니다. –
포트란 - 파이썬을 선호하는 강력한 이유. '4.0 = 3.5' 할당을 허락하는 어떤 언어도 심각하게 깨졌습니다. –
@ 마크 : 적어도 논쟁의 여지가있다. 누군가가 코드 블록을 재사용 할 수있는 서브 루틴을 설계한다면; 인수가 전달되는 방식에 무관심하고 불가지론하게 만드는 것이 더 좋습니다. Fortran의 일을 수행 할 때 나오는 이점 하나라도 이름을 붙일 수 있습니까? 나는 상수 값을 변경하는 것에 대한 당신의 요지를 얻지 만, 그것은'intent (out)'를 가진 인자에 대한 리터럴을 허용하지 않음으로써 주위를 둘러 볼 수 있습니다. 명확성을 위해 –