2010-06-29 3 views
3

다소 간단한 질문에 사과드립니다. 좋은 fortran 문서를 찾을 수없는 것 같습니다. 내가 단위에서 읽는 기능을 쓰기 위해 노력하고있어fortran에서 길이가 알려지지 않은 문자열 반환

출력을 트림과 null 종결, 같은 추가 :

character(*) function readCString() 
    character*512 str 
    read(1, *) str 
    readCString = TRIM(str)//char(0) 
    return 
end function readCString 

그러나, 나는이 그것을 컴파일 아직 작동하지 않습니다 알고 있습니다. 최근에는 세분화 오류가 내 친구가 아니 었습니다.

TRIM(str)//char(0) 

는 숫자 나 같은 길이되지 않습니다 : 때문에없이 "문자 (*)"기능 키워드하기 전에 가장 가능성, 컴파일하고, 또한 파괴 별의 위치에있는 값을하지 않습니다 별 대신에 넣는다. 저는 fortran에 매우 익숙하지만 일부 포트란 코드를 C (즉, 널 종결 자)와 인터페이스하려고합니다.

도움 주셔서 감사합니다.

답변

7

문자 (별표)는 함수 반환으로 사용하지 않는 것이 좋습니다. 문자 (별표)는 동적 가변 길이 문자열이 아닙니다. 이는 호출자로부터 길이를 얻는 것을 의미합니다. 따라서 고정 길이 문자열을 함수 반환으로 사용하거나 서브 루틴 인수로 문자 (*)를 사용하는 것이 좋습니다. 그러나이 경우 호출자는 메모리를 미리 예약해야합니다. 그러면 메모리가 미리 호출자에게 고정됩니다. 진정으로 최대 길이를 모르거나 동적 변수 길이 문자열이 있어야하는 경우이를 수행하는 방법이 있습니다. 가변 길이 문자열 모듈이 있습니다. Fortran 2003에는 할당 가능 스케일러가 있지만 널리 구현되지는 않습니다. 단일 문자 배열을 사용할 수 있습니다. 할당 할 수있는 배열은 오랫동안 사용되어 왔습니다.

module test_func_mod 
contains 
function readCString() 
    use iso_c_binding 
    character (kind=c_char, len=512) :: readCString 
    character (kind=c_char, len=511) :: str 
    read(1, *) str 
    readCString = TRIM(str) // C_NULL_CHAR 
    return 
end function readCString 

end module test_func_mod 

program test 

use test_func_mod 

open (unit=1, file="temp.txt") 
write (*, *) readCString() 

end program test 

당신이 포트란 및 C 인터페이스하려면

, 내가 바인딩 새로운 ISO C를 사용하는 것이 좋습니다 : 여기

는 포트란으로 작동하는 방법이다. Fortran과 C 또는 C 패싱 규칙을 사용하는 언어를 인터페이싱하기위한 표준적이고 이식 가능한 방법을 제공합니다. 과거에는 사용하기 쉬운 해킹보다 사용하기 쉽고 손상 될 가능성이 적었습니다. 공식적으로 Fortran 2003의 일부이지만 이미 수많은 컴파일러에서 지원됩니다. 문자열은 특히 어려웠는데 일부 컴파일러는 숨겨진 길이 인수 등이 있습니다. ISO C 바인딩은이 모든 것을 프로그래머에게 투명하게 만듭니다. 비슷한 질문 (포트란, C 및 문자열) stackoverflow에 대한 몇 가지 예제 코드를주는 기억 기억하지만, 질문을 찾을 수 없습니다.

관련 문제