Fortran中的字符串:可移植的LEN_TRIM和LNBLNK?
我需要一个可移植函数/子例程来定位字符串中最后一个非空字符的位置。我找到了两个选项:Fortran中的字符串:可移植的LEN_TRIM和LNBLNK?,fortran,portability,text-parsing,Fortran,Portability,Text Parsing,我需要一个可移植函数/子例程来定位字符串中最后一个非空字符的位置。我找到了两个选项:LEN\u TRIM和LNBLNK。然而,不同的编译器似乎有不同的标准。以下编译器的官方文档表明,LEN_TRIM是Fortran 95标准在以下平台上的一部分: IBM: 英特尔:还有 格弗特兰:还有 PGI: 然而,在F95标准之前发布的编译器上似乎没有任何保证。我的经验是,较旧的编译器可能会指定LEN_TRIM或LNBLNK,但不一定同时指定这两种。我的解决方案是使用预处理器条件: #ifdef USE
LEN\u TRIM
和LNBLNK
。然而,不同的编译器似乎有不同的标准。以下编译器的官方文档表明,LEN_TRIM是Fortran 95标准在以下平台上的一部分:
- IBM:
- 英特尔:还有
- 格弗特兰:还有
- PGI:
LEN_TRIM
或LNBLNK
,但不一定同时指定这两种。我的解决方案是使用预处理器条件:
#ifdef USE_LEN_TRIM
iNameLen = LEN_TRIM(cabase)
iExtLen = LEN_TRIM(caext)
#else
iNameLen = LNBLNK(cabase)
iExtLen = LNBLNK(caext)
#endif
然后将
-DUSE\u LEN\u TRIM
传递给预处理器。然而,我不太喜欢预处理器条件&额外的编译时标志您对可移植函数(Fortran 95标准之前)有什么建议吗?该函数可以定位字符串中最后一个非空字符的位置。在标准之前,我会说没有。我见过在F77代码上手动实现len_trim函数。如果您想成为旧编译器的标准,那么您必须提供自己的实现作为故障保护,并使用预处理器条件选择您需要的内容。我一直在尝试查找这是否是Fortran 95之前的版本,但确实如此
len(trim(s))
工作?透镜微调是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
编译这样的自由格式源代码)。mh。看起来是的,虽然我不想打赌。在g95和g77上测试。LEN==F77标准;微调=F95标准