2011-10-21 2 views
1

Visual Studio 2008에서 인텔 포트란 컴파일러 11을 사용하여 힙 손상 문제가 있습니다. Windows 7 64 비트에서 작업하고 있습니다. FORTRAN lapack 루틴을 인터페이스 할 때 매개 변수 손상

내 F90 프로그램에서 (F77) LAPACK 서브 루틴을 호출입니다 :이 전에

call dgetrs('N', nbParams, one, a, nbParams, ipv, x, nbParams, err) 

는 디버거가 모든 매개 변수에 대한 기대 값을 보여줍니다 호출합니다. a와 x는 각각 크기 (nbParams, nbParams)와 (nbParams)를 갖는 두 개의 "할당 가능"변수를 나타냅니다.

그러나이 줄을 실행 한 후 0x0000000000000001 위치를 읽는 액세스 위반으로 실행이 중지됩니다. 디버그 모드에서 lapack을 컴파일 했으므로 전화를 사용할 수 있지만 DGETRS의 첫 번째 명령문에서 'TRANS'가 손상된 것을 볼 수 있습니다.

SUBROUTINE DGETRS(TRANS, N, NRHS, A, LDA, IPIV, B, LDB, INFO) 
    ... 
    CHARACTER   TRANS 
    INTEGER   INFO, LDA, LDB, N, NRHS 
    ... 
    INTEGER   IPIV(*) 
    DOUBLE PRECISION A(LDA, *), B(LDB, *) 
    ...... 
    INFO = 0  **--> Now all input vars but TRANS are corrupted or dereferenced!** 

나는 모든 것을 시도했지만 문제를 찾을 수 없습니다. 아무도 내가 문제를 찾는데 도움을 줄 수 있습니까?

도움 주셔서 감사합니다.

+0

'dgetrs'에 대한 실제 인수의 유형은 무엇입니까? Lapack은 인자 타입의 불일치를 다루기가 쉽지 않다. –

+0

호출자에있는 vars의 선언을 어떻게 추가 할 수 있는가? –

+0

정수 nbParams, one, err; 배정도, 치수 (:), 포인터 :: x; 배정 밀도, dimension (:, :), allocatable :: x; allocate (x (nbParams), stat = err); 정수, 차원 (:), allocatable :: ipv; 그런 다음 배열을위한 메모리를 할당합니다 : allocate (nbParams, nbParams), stat = err); allocate (ipv (nbParams), stat = err); –

답변

0

이러한 종류의 문제는 일반적으로 인터페이스없이 가정 된 모양 배열을 사용할 때 나타납니다. 다음과 같은 인터페이스를 선언 해보십시오 :

INTERFACE 
    SUBROUTINE DGETRS(TRANS, N, NRHS, A, LDA, IPIV, B, LDB, INFO) 
    CHARACTER   TRANS 
    INTEGER   INFO, LDA, LDB, N, NRHS 
    INTEGER   IPIV(*) 
    DOUBLE PRECISION A(LDA, *), B(LDB, *) 
    END SUBROUTINE 
END INTERFACE 
관련 문제