为什么 trim( " " ) == " " 在 Fortran 中返回 false?



我面临的随机不连贯...在某些情况下,trim(")= ="返回false。

我做了这样的事情(所以使用类型的一种串联函数)当然可以做很多简化的代码,但是由于这个修剪问题,我这样做了,以确保没有什么是混乱:

character*150 :: tab(5)
character*150 :: var
character*50 :: a
character*50 :: b
character*50 :: c
character*50 :: d
a= '' ! comes from a type nameType%pref
b= '' ! parameter
c= '' ! comes from a type nameType%suf
d= 'deviceName' ! parameter
if (trim(d) .ne. '') then
    var = d
else
    if (trim(c) .ne. ''  .and. (trim(a) .ne. '' .or. trim(b) .ne. ''))then
            var = trim(a)//trim(c)//trim(b)
    else
        var = ''
    end if
end if
var = trim(a)//trim(b)//trim(c)
tab(1) = var
if (trim(tab(1)) .eq. '') then
     print*, ("hi")
end if

这是此功能末尾的出口:

trim(var) :
len_trim(var) :            0 
trim(var) == " : T

此代码有时可以正常工作,有时不……(我的意思是我有其他空变量,并且我仅在某些变量上面对这个问题)我认为空间字符已加密,因为在调试模式下,我有像一样的随机值"pï" ...

这是错误打印的出口,当我要求ASCII值时:

    修剪(var):    len_trim(var):150    Trim(var)==":f    iChar(var(j:j)),">"//var(j:j)//"<"           0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 00> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 00> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 00> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 00> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 00> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0    

so Trim(Tab(i))的修剪为150 null。

我创建了此功能来解决该问题:

      逻辑函数ISNULL(var)          隐式没有          角色 *( *):: var          逻辑:: ret          ret = iChar(var(1:1)).eq。0          isnull = ret          返回      结束功能

函数TRIM确实:

7.170 TRIM (STRING)
描述:字符串而不落后空白。
类:变换功能。
参数: STRING应为字符标量。
结果特征:具有与STRING相同类型的参数值的字符,并且长度为STRING的长度少于STRING中的尾随空白的数量。如果STRING不包含非蓝色 字符,结果的长度为零。
结果值:结果的值与STRING相同,除了删除任何尾随空白。
示例: TRIM (" A B ")具有值" A B"

来源:Fortran 2008 Standard

您注意到,单词 blank 在此定义中出现了很多,并且代表了相应字符集中的空白。

我的怀疑是您正在处理来自具有CRLF线终止的DOS-Box的数据。或字符串末尾的任何其他无法打印的字符。您可以通过打印字符串的每个字符来验证这一点,并且是对应的ASCII编号。

例如,如果您的字符串为str

   do i=1,len(str)
      print *, ichar(str(i:i)), ">"//str(i:i)//"<"
   done

whitespace字符应该具有值32。如果您有不同的值,则可以在这里查看:http://www.asciatible.com/

相关内容

  • 没有找到相关文章

最新更新