문제

문자열에서 공백이 아닌 마지막 문자의 위치를 ​​찾으려면 이식 가능한 함수/서브루틴이 필요합니다..두 가지 옵션을 찾았습니다. 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))

일하다?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top