2017-11-10 9 views
0

우리는 인텔의 비주얼 포트란을 사용하여 다시 컴파일하려고하는이 오래된 Fortran 스크립트를 가지고 있지만 계산 오류와 이전 컴파일 된 코드와 다른 결과를 얻습니다.'속성 저장'으로 속성을 처리 할 때 Fortran 컴파일러의 차이점이 있습니까?

우리는 아래의 코드 (숫자 조리법에서 느슨하게 나온)에서 문제가 될 것으로 생각되는 것을 발견했습니다.

문제는 'it'매개 변수가 각 호출에 대해 재설정되지만 함수 호출 사이에 저장해야한다는 것입니다.

문제가되는 가장 좋은 추측은 구형 컴파일러가 '저장 특성'으로 'it'을 처리했을 수 있으므로 함수 호출간에 저장한다는 것입니다.

우리는 여기서 완전히 틀릴 수도 있습니다. 일부 Fortran-Guru가이를 확인하거나 더 잘 묘사 할 수 있다면 우리는 도움이 될 것입니다!

 subroutine TrapezoidalRule(Func, a, b, s, n) 
* 
*  This routine performs the trapezoidal rule, see Numerical Recipes 
* 
     implicit none 
     real*8 Func, a, b, s 
     Integer*4 n 
     external Func 
* 
     real*8 del, x, sum 
     Integer*4 it, tnm, j 
* 
     if (n .eq. 1) then 
* 
     s=0.5d0*(b-a)*(Func(a)+Func(b)) 
     it=1 
* 
     else 
* 
     tnm=it 
     del=(b-a)/dble(tnm) 
     x=a+0.5d0*del 
     sum=0.d0 
     do 11 j=1,it 
* 
      sum=sum+Func(x) 
      x=x+del 
* 
11  continue 
* 
     s=0.5d0*(s+(b-a)*sum/dble(tnm)) 
     it=2*it 
* 
     endif 
* 
     return 
     end 
+0

음, 듣고 싶습니까? 일종의, 일종의 ... 만약 당신이 그렇게 믿을만한 이유가 있다면, 아마도 사실 일 것입니다. 그래서, 그 질문은 무엇입니까? 그것은 가능하다고 말하는가? 예, 가능합니다. 그러나 당신은 무엇을 더 원합니까? –

+0

제 말은 여러분의 선과 악의 결과가 없다는 것입니다. 우리는 그들이 어떤면에서 다른지 모르고 테스트를 복제 할 수 없습니다. 우리는 당신을 믿기 위해 그 이상을 할 수 없습니다. 'save' 속성을 추가하는 것이 도움이 되었습니까? 우리는 그것이 어떤 컴파일러인지 알지 못합니다. –

+0

내 질문에 불분명해서 죄송합니다. 조금 좌절했다. 우리는 어느 컴파일러가 사용되었는지 알지 못한다. 아무도 아직 초기 작업에 관여하고 있지 않다. 우리는 Fortran에 대한 좋은 통찰력을 가진 누군가가 과거에 '속성 저장'을 어떻게 처리했는지 알고 있었기 때문에이 문제에 대한 좋은 정보를 찾기가 어려웠습니다. – Petter

답변

2

예, 설명은 그럴듯합니다. 코드

tnm=it 

it 변수에 액세스하고 itsave가 아닌 경우,이 값은 정의되지 않는다.

이전 컴파일은 스택을 전혀 사용하지 않았으며 모든 변수에 정적 저장소를 사용했을 수 있습니다. 또한 스택을 사용했을 수도 있지만 덮어 쓰지 않고 값이 같은 곳에서 있었던 것입니다. 누가 알겠습니까? 우리는 알고있는 정보가 없습니다.

save 속성을 이와 같이 잘못된 코드의 모든 변수에 강제 적용하는 컴파일러 옵션이 있습니다 (모두 SAVE은 결코 표준이 아니 었습니다!). 인텔 포트란은 -save입니다.

+0

가능한지 확인해 주셔서 감사합니다. , 나는 그것에 깊이 파고들 것이다. 코드가 많아서 이것이 프로젝트에서 발생하는 문제가 될 수 있으므로 걱정됩니다. – Petter

+1

내가 참조한'-save' 옵션을 시도해 볼 수 있습니다. 자세한 내용은 설명서를 참조하십시오. 인텔 지원 포럼에는 관련 스레드가 있습니다. –