2010-01-07 3 views
2

내가 가지고있는 다음과 같은 FORTRANFORTRAN의 LEN_TRIM은 전달 된 매개 변수와 다르게 동작합니까?

SUBROUTINE SETPATHS(INPUT) 
    !DEC$ ATTRIBUTES DLLEXPORT::SetPaths 

    CHARACTER*20 INPUT 
    CHARACTER*20 DIRECTORY 

    DIRECTORY = 'ABCDEFG' 

    WRITE(6, *) 'INPUT LEN_TRIM = ', LEN_TRIM(INPUT) 
    WRITE(6, *) 'DIRECTORYLEN_TRIM = ', LEN_TRIM(DIRECTORY) 

    END SUBROUTINE 

내가 'ABCDEFG'를 전달, C#을에서 함수를 호출하고 있습니다.

내 디버거에서 중단 점을 설정할 때 INPUT과 DIRECTORY는 정확히 같은 문자를 사용합니다. 둘 다 뒤에 'ABCDEFG'와 동일한 수의 후행 공백이옵니다.

그러나 프로그램 출력

INPUT LEN_TRIM = 20 
    DIRECTORYLEN_TRIM = 7 

이 올바른 동작인가? 두 문자열의 값이 같으면 LEN_TRIM이 다른 결과를 얻는 이유는 무엇입니까?

업데이트 :이 문서화 된 문제가 발견되었습니다 (인텔 8.1 컴파일러는 아니지만). http://support.microsoft.com/kb/89131

+0

완전히 실감 났지만 C#에서 FORTRAN의 함수를 호출하는 이유는 무엇입니까? –

+1

FORTRAN은 번호를 처리합니다. C#은 모든 배관을위한 가장 생산적인 언어입니다. – Larsenal

+0

@Mitch : 불행히도, 당신은 Lapack을 이길 수 없습니다. –

답변

1

내 C# StringBuilder를 후행 공백으로 명시 적으로 채우면 LEN_TRIM이 예상대로 작동합니다. This Microsoft KB과 관련이있는 것 같습니다.

그러나 디버거에서는 명시 적 패딩을 수행하기 전에도 후미 공백이 나타납니다.

+0

이전 질문 (http://stackoverflow.com/questions/2018277/how-to-pass-parameter-from-c-to-fortran-with-parameter-of-type-character50)에서 Fortran 문자열의 작동 방식에 대해 설명했습니다. 나머지 문자열을 공백으로 채워야한다고 제안했습니다. –

+0

예, 읽었습니다. 그러나 디버거에서 볼 때, 명시 적으로 채우지 않은 채 이미 비어있었습니다. 쓰레기가 아닙니다. 모든 캐릭터는 20 대입니다. – Larsenal

1
[email protected]:~ $ ./a.out 
INPUT LEN_TRIM =   7 
DIRECTORYLEN_TRIM =   7 
[email protected]:~ $ more test.f90 
SUBROUTINE SETPATHS(INPUT) 

CHARACTER*20 INPUT 
CHARACTER*20 DIRECTORY 

DIRECTORY = 'ABCDEFG' 

WRITE(6, *) 'INPUT LEN_TRIM = ', LEN_TRIM(INPUT) 
WRITE(6, *) 'DIRECTORYLEN_TRIM = ', LEN_TRIM(DIRECTORY) 

END SUBROUTINE 
program test 
    character*20 foo 
    foo = "ABCDEFG" 
    call setpaths(foo) 
end program 

어떤 컴파일러를 사용하고 있습니까? 여기 gfortran.

뿐만 아니라

$ ifort -v 
Version 8.0 
$ ifort test.f90 
$ ./a.out 
INPUT LEN_TRIM =   7 
DIRECTORYLEN_TRIM =   7 

나는 C#을 인터페이스 문제를 소개하는 방법을 모르는 ifort와 시도,하지만 당신은 문자열에서와 동일하게 나타나는 말한다면 LEN_TRIM의 의미는 ... 아주 쉽게 디버그, 뭔가 매우 생선이 계속되고 있습니다.

+0

인텔 컴파일러를 사용하고 있습니다. – Larsenal

+0

ifc에 액세스 할 수 있는지 잘 모르겠다. 시도해보고 ... 어쩌면 ....어떤 버전입니까? –

+0

버전 8.1을 사용하고 있습니다. 그것이 C#에서 StringBuilder를 통과 한 사실과 더 관련이 있는지 궁금합니다. – Larsenal

1

터미네이터 문자 인 char (0)을 찾고있을 수 있습니다. \ n 문자와 다를 수 있습니다.

기타 문자열 길이가 올바르게 전달되지 않았습니다. Fortran 77 문자열은 문자열 포인터와 문자열 길이의 두 값으로 전달됩니다. 문자열 길이가 전달되는 표준이 없기 때문에 대부분의 컴파일러는 결국 숨겨진 매개 변수로 사용합니다. 90 일 수 있습니다 호환성을 위해 같은 일을합니다.

+0

OP가 사용하는 일반적인 Fortran 문자열은 길이가 고정되어 있으며 끝에 공백이 있습니다. 길이는 사용 된 길이가 아니라 선언 된 길이입니다. 종료 문자가 없습니다. –

관련 문제