2012-05-22 4 views
1

f2c 변환기 (f2c)를 사용하여 일부 기존 Fortran 코드를 C로 변환했으며 Windows 7 (64 비트)에서 Visual Studio 10 솔루션을 만들었습니다.). 또한 내 C++ 프로그램 (내 주요 기능을 포함하는 test.cpp)을 f2c 라이브러리 (nmake를 사용하는 시스템에서 빌드 됨)와 연결해야했습니다.주 기능이 끝나면 런타임 스택 오류가 발생합니다.

이 프로그램은 실행되지만 주요 기능의 끝에 도달하면, 나는 다음과 같은 디버그 오류가 나타납니다 인해 F2C 만든 "수정"을

Stack around the variable 'qq' was corrupted 
Stack around the variable 'pf' was corrupted 
Stack around the variable 'ampls' was corrupted 

이있을 경우 내가 궁금를 변환 된 C (포트란에서) 파일 컨버터는 이러한 모든 변수는 C 배열이기 때문에

/* Parameter adjustments */ 
--x1; 
--xabs; 
--ximag; 
--xreal; 
--work4; 
--work3; 
--work2; 
--work1; 
--ampls; 
--pf; 
--qq; 
--tri; 

이 조금 이상한 것, 그리고 내가 F2C 프로그램이 단순히 인덱스 0 있도록 몇 가지 포인터 연산을 수행하고 있다고 생각 배열에서 배열은 인덱스 1이됩니다. 이는 Fortran과 비슷한 방식입니다.

할당되지 않은 배열 요소에 액세스하는 변환 된 코드에 문제가있을 수 있는지 여부는 알 수 없습니다.

이 오류를 디버그하고 수정하는 가장 좋은 방법은 무엇입니까?

+4

글쎄 포인터 연산은'[] '연산자가하는 일입니다 ... 주 함수를 게시해야하지만, 배열에 할당 된 메모리 범위를 넘어서 쓰는 것 같습니다. – Dennis

+2

valgrind (linux only)는 일반적으로 이와 같은 상황에서 매우 유용합니다. – Brady

+1

아마도 번역 된 프로그램이 실행될 때 유사한 출력을 생성하는 간단한 포트란 프로그램을 번역 할 수 있습니다. 간단하다면 포트란과 번역 된 소스를 게시 할 수 있어야합니다. 그냥 배열의 각 요소에 하나씩 추가하는 함수를 호출하는 프로그램이 트릭을 수행 할 것으로 짐작할 수 있습니다. –

답변

1

잠재적 이유 :

  • 이 에러는 일반적으로 배열 (동적 또는 정적 배열)의 경계 밖에 기록에 관한 것이다. 이 오류는 -ve 인덱스 또는 index> = size_of_array에 값을 \ 가져 오는 경우 발생할 수 있습니다.
  • 포인터가 올바른 위치로 설정되지 않은 경우에도이 오류가 발생합니다. 내 마음은 단계 단계-으로하고 prorgam를 디버깅하는 것입니다 귀하의 오류를 디버깅

가장 좋은 방법은() 메모리, 또는 잘못된 주소 또는 무료하고있다 예를 들어 ptr = 0, ptr = 55는 발표 (삭제를 가리키는) 그 포인터 값들을 봐라. 그들에게 약간의 틀림이 있어야합니다.

+0

의견을 보내 주셔서 감사합니다, Desolator. 나는 지금 프로그램을보고 어떤 종류의 해결책 (단계별)을 찾으려고 노력하고있다. –

1

당신이 말하는 것은 사실 일 수 있습니다. 나는 배열을 사용하고 f2c가하는 것과 똑같이 포인터를 감소시키는 매우 작은 프로그램을 생성 할 것을 제안한다. 비슷한 것

int aa[10]; 
int *pa = aa; 
--pa; 
pa[1] = ... 

즉, 의심되는 코드를 소규모로 테스트하십시오. 이런 식으로 문제의 원인을 찾아 낼 수 있습니다. (대안 찾기는 다른 이야기입니다)

+0

제안 해 주셔서 감사합니다. 나는 주된 기능과 변환 된 파일 내의 기능 모두에서 비슷한 코드를 시도해 왔으며, 배열의 색인에 문제가있는 것으로 보인다. 귀하의 게시물은 내가 실제로 여기에서 일어나는 일의 가능성을 좁히는 데 도움이되었습니다. –

1

crt의 디버그 버전으로 컴파일 하시겠습니까? 그러면 좀 더 많은 정보를 얻을 수 있습니다.

또한 라이브러리가 C로 작성되었으며 응용 프로그램이 C++로 작성되었을 가능성이 있습니까?

이러한 오류는 종종 다른 호출 규칙 때문에 발생합니다. 64 비트 응용 프로그램이라고 말하면 문제가되지 않아야합니다 (모든 64 비트 응용 프로그램은 동일한 호출 규칙을 사용함).

모든 fortran 변환 코드를 Visual Studio에 추가 할 수 있습니까? 아니면 별도의 제작을 할 수 있습니까?

관련 문제