2010-08-12 1 views
1

배열을 반복하는 프로그램을 가지고 결정적으로 새로운 행 벡터를 만들어 배열에 추가합니다.포트란 디버깅 print 문이 프로그램 흐름에 영향을 미침

각 반복에서 0 벡터가 아닌지 확인하기 위해 벡터의 표준을 취합니다. 0이면 프로그램이 중지됩니다.

세 번째 반복으로 인해 벡터가 0이되는 버그가있었습니다. 이 버그를 찾고에서

나는, this_var 등 (최신 벡터의 규범을 인쇄)이 인쇄 문 중 하나는 "여기", 디버깅 print 문, 인쇄 *와 코드를 작성 프로그램을 고정.

print 문을 좋아하지 않습니다. 나는 또한 내가 무슨 일이 일어나고 있는지 이해하지 못하는 것을 좋아하지 않는다.

인쇄 진술이 인쇄하는 것에 영향을주는 이유에 대해 알고 싶은 사람이 있습니까?

코드 (~ 400 선, 코멘트 많이) 제임스

+5

범위를 벗어나는 인덱스 인덱싱으로 인해 동작이 변경 될 수 있습니다. – James

+0

어떤 컴파일러를 사용하고 있습니까? 우리는 디버깅 할 때 사용할 좋은 컴파일러 옵션을 제안 할 수 있습니다. –

+0

ifort (Intel)를 사용하지만 gfortran이 도움이된다면 컴파일 할 수 있습니까? 고마워요! – Samizdis

답변

3

가능이이 배열 인덱스에 의해 야기 될 수있는, 코멘트에 지적했다. 배열 범위 검사가 켜져있는 상태에서 코드를 다시 컴파일해야합니다 (이렇게하는 명령은 컴파일러에 따라 다를 수 있음). 프로그램을 실행하십시오.

그리고 당신은 절대적으로 정확합니다. 이런 교활한 오류는 절대적으로 미치게합니다.

0

한 번에 컴파일러 또는 링커와 관련하여 이와 유사한 결과가 발생했습니다. 문제의 코드 라인은 여러 프로그램에서 동일했고 모두이 코드를 제외하고는 모두 작동했습니다. 이 경우 문제의 라인은 aritmetic if. 여러 표준으로 변환 한 후 else 문을 사용해야하는 것처럼 작동했습니다. 이것이 오류 일 가능성은 매우 낮지 만, 나는 그것을 밖으로 내 보내야한다.
또한 Tim의 대답에 pluss를 써야합니다. 컴파일러 옵션이 가장 중요합니다.

+0

필자는 그가 "Fortran 90"이라는 질문을 산술 if 태그가 발견 될 곳이 없다고 태그 한 이후로 기대하고있다. –

1

은 범위를 벗어난 액세스로 인해 메모리를 덮어 쓰는 것처럼 보입니다. 배열 범위를 검사하여 컴파일하십시오. 프로그램 실행 속도가 느려지지만 메모리 위반을 발견 할 수 있습니다.

0

서브 루틴을 사용합니까?

가끔 서브 루틴의 일부 데이터를 덮어 쓰고 다시 전파되지 않지만 결과가 손실됩니다.

서브 루틴 호출에 올바른 유형이 있습니까?

인 텐트를 사용하고 있습니까?

고정 치수를 사용합니까?