2009-04-23 1 views
3

호출 FORTRAN하는 내가 포트란를 호출하는 C 함수, 리터럴 문자열 "XXXXXX"를 통과 (null이 아닌 종료)와 숨겨진 통과 길이 인수 6이 10.1C는 인텔 포트란과 윈도우 64에서 Visual Studio 9를 사용하여 문제

디버거가 character (6) var이고 올바른 문자열을 가지고 있기 때문에 Fortran이 올바르게 처리되지만 다른 Fortran 문자 * 6 var에 할당하려고하면 가장 이상한 오류가 발생합니다.

forrtl: severe (408): fort: (4): Variable Vstring has substring ending point 6 which is greater than the variable length 6

- C 호출 -

SETPR("abcdef",6); 

- 포트란 서브 루틴 -

subroutine setpr(vstring) 

character*(*) vstring 

character*6 prd 

prd(1:6) = vstring(1:6) 

return 

end 
+1

일부 코드 스니 펫을 추가하면 Fortran을 아는 사람이 분석 할 수 있습니다. – lothar

+0

실제로 일부 코드가 도움이 될 것입니다. 특히 Fortran 서브 루틴 선언과 C. –

+0

의 호출은 SETPR ("abcdef", 7); C 문자열은' '\ 0''을 갖는다. – dsm

답변

1

나는 인텔이 시도 C 컴파일러 및 인텔 포트란 컴파일러. 이것은

S is abcdef 
Length of S is   6 
Implicit-copied C is abcdef 
Range-copied C is abcdef 

유형에 대한 C 루틴에 선언이 무엇입니까

을 생산,

subroutine test_f(s) 
    implicit none 
    character*(*), intent(in) :: s 

    character*6 :: c 

    write (*,*) 'S is ', s 
    write (*,*) 'Length of S is', len(s) 

    c = s 
    write (*,*) 'Implicit-copied C is ', c 

    c(1:6) = s(1:6) 
    write (*,*) 'Range-copied C is ', c 
end subroutine test_f 

컴파일하고 실행하면, 포트란, C에서,

#include <stdio.h> 

int main(void) 
{ 
    extern void test_f_(char*, int); 

    test_f_("abcdef",6); 
} 

을주고 포트란 루틴의? 문자와 정수 변수의 크기가 C와 Fortran 코드 사이에서 동일합니까?

+0

여기 인텔 C 컴파일러를 사용하지 않습니다. Linux 버전에서 잘 작동합니다. 이 문제는 Windows의 MSVC 컴파일러에서 발생합니다. – user72260

+0

Fortran 루틴의 C에있는 선언은 여기에 표시된 것과 동일합니까? –

+0

예 아니요. 원본은 출처를 공개하는 데 대해 편집증을 앓고 있기 때문에 공유 할 수없는 코드입니다. 이것은 같은 방식으로 실패하는 것을 보는 한 가지 방법 일뿐입니다. – user72260