2012-04-01 4 views
2

Compaq Visual Fortran에서 프로그램을 작성했습니다. 프로그램이 정상적으로 작동하며 많은 경우 올바르게 실행됩니다. 내가 지금 일하고 있어요 사건은 더 큰 입력 데이터 파일과 함께, 더 큰이며, 나는 다음과 같은 오류가 프로그램을 실행하면Fortran에서 스택 오버플로

forrtl: severe(170): Program exception - stack overflow

을 나는 editbin.exe 프로그램이 설치되어 있지만, 정말 방법을 모르는 그걸 써.

editbin /STACK:4000000 DFDEV.exe 

를 입력 할 때 그것이 내가이 프로그램을 포함하는 디렉토리 안에있어 경우에도, DFDEV.exe을 열 수 있음을 알려줍니다 (C : \ 프로그램 파일 \의 Microsoft Visual Studio \ 공통 \ MSDEV98 \ BIN). 정말이 문제를 해결하는 방법을 모르겠다. 인터넷에서이 주제에 관해 발견 한 모든 주제에서이 editbin 프로그램을 사용하는 방법에 대한 설명이 없다.

+0

아마도'editbin'을 실행할 때'DFDEV.exe'의 전체 경로를 제공해야합니다. 다른 커맨드 라인 입력없이 명령 행에'editbin' 만 입력하면 [editbin 옵션을 요약하는 사용법 설명을 볼 수 있습니다.] (http://msdn.microsoft.com/en-us/library/xd3shwhf % 28v = 80 % 29.aspx). 그러나 editbin을 사용하는 방법을 모르는 경우 프로그램 테스트 예외 오류를 디버깅하는 데 올바른 도구라고 생각하는 이유는 무엇입니까? – Chris

+2

데이터가 너무 커서 스택에 맞지 않는 경우 힙에 할당하는 것이 좋습니다. –

+1

+1 @ DavidHeffernan의 의견; 특히 동적 할당을 사용하지 않는 오래된 포트란 프로그램의 경우 스택 오버플로는 거의 항상 서브 루틴이나 함수의 대형 정적 배열이 너무 커져서 스택에 맞지 않는다는 것을 의미합니다. 운영체제에 따라서는 힙에 큰 배열을 할당하도록 컴파일러에게 확신시킬 수 있지만, 무엇보다도 큰 정적 배열을 전혀 가지지 않고 필요한 경우 할당하는 것이 가장 좋습니다. –

답변

0

컴파일러 "도움"도 도움이되지 않습니다. 프로그래머 가이드는 스택 및 힙 할당에 대해 "커밋"에 대한 검색을 통해 찾을 수 있으며 EDITBIN.EXE를 사용하여 이미 컴파일 된 .exe 파일을 수정할 수 있다는 힌트를 제공합니다. 나중에 언급했듯이 컴파일러 옵션 Project> Settings> Link> Output도 있습니다. 더 큰 값을 지정할 가능성이 있지만 어떤 값에 대한 지침은 거의 없습니다.

서브 루틴에 선언 된 저장소에 대해 AUTOMATIC을 사용하는 컴파일러 옵션이 있지만 일부 프로그램은 호출간에 "정적"으로 저장되는 데이터에 의존하여 부지런히 지정하지 않습니다. 나는 SAVE에주의를 기울 였고 "자동"을 선택했을 때 어떤 효과도 발견하지 못했습니다. 필자가 약간의 재귀 (Burroughs fortran에서는 자동으로 사용 가능 - RECURSIVE 키워드는 otiose)를 도입 한 후에 문제가 발생했지만 스택 저장은 임시 변수 (배열 크기 일 수도 있음)와 복사 인, 복사 아웃 매개 변수 배열 섹션으로 또는 예를 들어 blob 유형의 배열을 전달합니다. 여기서 blob은 정수를 포함하는 복합 엔티티이고 정수를 A (i : j)에서와 같이 배열로 표시하려고합니다 .Fred, 여기서 저장소 , Blob에 다른 항목들도 포함되어 있기 때문에 Fred의 연속 요소는 사실 인접하지 않습니다 (stride = 1).

어쨌든 (bigenough, n) 등의 배열이 아닌 배열을 할당하기 위해 할당 된 배열을 사용하기 시작했으며 이제 변경 사항을 확인하고 설정이 기본값으로 되돌아 갔음을 발견했습니다. (빈 항목), 의심의 여지가 전원 공급 장치가 실패한 후 새 컴퓨터에 중간에 재설치로 인해.