Строки символов в Фортране: Портативные LEN_TRIM и LNBLNK? - PullRequest
2 голосов
/ 11 августа 2009

Мне нужна переносимая функция / подпрограмма, чтобы найти позицию последнего непустого символа в строке . Я нашел два варианта: 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) функции, которая определяет местоположение последнего непустого символа в строке?

Ответы [ 3 ]

3 голосов
/ 11 августа 2009

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 для компиляции исходного кода в свободной форме, как этот).

2 голосов
/ 11 августа 2009

Я застрял, пытаясь выяснить, является ли это пре-Фортран 95 или нет, но делает

len(trim(s))

работа

2 голосов
/ 11 августа 2009

До стандарта я бы сказал нет. Я видел функцию len_trim, реализованную вручную на кодах F77. Если вы хотите быть стандартным по отношению к старым компиляторам, вам придется предоставить собственную реализацию в качестве отказоустойчивой и использовать условный препроцессор, чтобы выбрать то, что вам нужно.

...