Fortran의 문자열:휴대용 LEN_TRIM 및 LNBLNK?
-
12-09-2019 - |
문제
문자열에서 공백이 아닌 마지막 문자의 위치를 찾으려면 이식 가능한 함수/서브루틴이 필요합니다..두 가지 옵션을 찾았습니다. LEN_TRIM
그리고 LNBLNK
.그러나 컴파일러마다 표준이 다른 것 같습니다.다음 컴파일러에 대한 공식 문서에서는 LEN_TRIM이 다음 플랫폼에서 Fortran 95 표준의 일부라고 제안합니다.
그러나 F95 표준 이전에 출시된 컴파일러에서는 아무것도 보장되지 않는 것으로 보입니다. 내 경험에 따르면 이전 컴파일러에서는 다음 중 하나를 지정할 수 있습니다. LEN_TRIM
또는 LNBLNK
, 그러나 반드시 둘 다일 필요는 없습니다.내 솔루션은 전처리기 조건을 사용하는 것이었습니다.
#ifdef USE_LEN_TRIM
iNameLen = LEN_TRIM(cabase)
iExtLen = LEN_TRIM(caext)
#else
iNameLen = LNBLNK(cabase)
iExtLen = LNBLNK(caext)
#endif
그런 다음 통과 -DUSE_LEN_TRIM
전처리기에.그러나 나는 전처리기 조건 및 추가 컴파일 시간 플래그를 별로 좋아하지 않습니다. 문자열에서 공백이 아닌 마지막 문자의 위치를 찾는 이식 가능한(Fortran 95 표준 이전) 함수에 대한 제안 사항이 있습니까?
해결책
LEN_TRIM은 Fortran 95 표준의 일부입니다.나는 이 문제를 해결할 수 있는 Fortran 77의 내장 함수의 간단한 조합을 알지 못합니다(TRIM은 Fortran 95에도 등장했으며 Fortran 77에서는 사용할 수 없었습니다).그러나 컴파일러 내장 함수 및 전처리기에 의존하지 않고 실제로 이식성을 원할 경우 간단한 사용자 함수를 사용하여 해당 작업을 수행할 수 있습니다.
function lentrim(s)
implicit none
character(len=*) :: s
integer lentrim
do lentrim = len(s), 1, -1
if (s(lentrim:lentrim) .ne. ' ') return
end do
end function lentrim
(테스트 g77
그리고 gfortran
;사용 옵션 -ffree-form
이와 같은 자유 형식 소스를 컴파일하려면).
다른 팁
표준 이전에 나는 아니오라고 말할 것입니다.F77 코드에서 직접 구현한 len_trim 함수를 본 적이 있습니다.오래된 컴파일러에 대한 표준이 되려면 안전 장치로 자체 구현을 제공하고 전처리기 조건을 사용하여 필요한 것을 선택해야 합니다.
나는 이것이 Fortran 95 이전 버전인지 아닌지 찾으려고 노력하고 있지만, 그렇습니다.
len(trim(s))
일하다?