2009-08-10 6 views
2

Мне нужна портативная функция/подпрограмма, чтобы найти положение последнего непустого символа в строке. Я нашел два варианта: LEN_TRIM и LNBLNK. Однако разные компиляторы, похоже, имеют разные стандарты. Официальная документация для следующих компиляторов предполагает, что LEN_TRIM является частью стандарта Fortran 95 на следующих платформах:Символьные строки в Фортране: портативные LEN_TRIM и LNBLNK?

Однако, это что ничего не гарантировано в компиляторах, выпущенных до стандарта 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

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

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

2

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

len(trim(s)) 

работу?

+0

mhmhmh. похоже, что делает, хотя я бы не стал делать ставку на него. протестированы как на g95, так и на g77. –

+1

LEN == F77 стандарт; TRIM == Стандарт F95 – Pete