Почему trim ("") == "" возвращает false в Фортране? - PullRequest
0 голосов
/ 20 марта 2019

Я сталкиваюсь со случайной несогласованностью ... В некоторых случаях 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

Этот код иногда работает, а иногда нет ... (я имею в виду, у меня есть другие пустые переменные, и я сталкиваюсь с этой проблемой только с некоторыми переменными) Я думаю, что символ пробела зашифрован, потому что в режиме отладки у меня есть случайные значения, такие как "пи" ...

Вот выход при печати ошибки и когда я запрашиваю значение ASCII:

    trim(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 >           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 >           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 >           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 >
    

Таким образом, trim (tab (i)) выполняет обрезку 150 NULL.

Я создал эту функцию для решения этой проблемы:

      logical function isNULL(var)
          implicit none
          Character *(*) :: var
          logical :: ret
          ret = ichar(var(1:1)) .eq. 0
          isNULL = ret
          return 
      end function

1 Ответ

1 голос
/ 22 марта 2019

Функция TRIM делает:

7.170 TRIM (STRING) Описание: Строка без конечных пробелов. Класс: Трансформационная функция. Аргумент: STRING должен быть скалярным символом. Характеристики результата: Символ с тем же значением параметра типа типа, что и у STRING, и с длиной, равной STRING минус количество концевых пробелов в STRING.Если STRING не содержит непустых символов, результат имеет нулевую длину. Значение результата: Значение результата совпадает с STRING за исключением того, что удаляются все конечные пробелы. Пример: TRIM (" A B ") имеет значение " A B".

источник: Стандарт Fortran 2008

Как вы заметили, слово blank часто встречается в этом определении и представляет пробел в соответствующем наборе символов.

Я подозреваю, что выобработка данных, поступающих из DOS-бокса, имеющего завершение строки CRLF.Или любой другой непечатаемый символ в конце вашей строки.Вы можете проверить это, напечатав каждый символ строки и соответствующий ему номер ASCII.

Например, если ваша строка str:

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

пробельные символы должны иметь значение 32. Если выиметь другое значение, вы можете посмотреть здесь: http://www.asciitable.com/

...