LEN_TRIM FORTRAN ведет себя по-разному с переданными параметрами? - PullRequest
2 голосов
/ 07 января 2010

У меня есть следующий Фортран

  SUBROUTINE SETPATHS(INPUT)
  !DEC$ ATTRIBUTES DLLEXPORT::SetPaths

  CHARACTER*20 INPUT
  CHARACTER*20 DIRECTORY

  DIRECTORY = 'ABCDEFG'

  WRITE(6, *) 'INPUT LEN_TRIM = ', LEN_TRIM(INPUT)
  WRITE(6, *) 'DIRECTORYLEN_TRIM = ', LEN_TRIM(DIRECTORY)

  END SUBROUTINE

И я вызываю функцию из C #, передавая 'ABCDEFG'.

Когда я устанавливаю точку останова на моем отладчике, INPUT и DIRECTORY имеют одинаковые символы. У обоих есть «ABCDEFG», за которым следует одинаковое количество пробелов.

Однако программа выводит

  INPUT LEN_TRIM = 20
  DIRECTORYLEN_TRIM = 7

Это правильное поведение? Если две строки имеют одинаковые значения, почему LEN_TRIM дает разные результаты?

Обновление: я обнаружил эту задокументированную проблему (хотя это не мой компилятор Intel 8.1). http://support.microsoft.com/kb/89131

Ответы [ 3 ]

1 голос
/ 07 января 2010

возможно, он ищет символ Терминатора, char (0). может отличаться от \ n символа

другая возможность, длина строки не была передана правильно. строка fortran 77 передается в виде двух значений: указатель строки и длина строки. нет стандартного способа передачи длины строки, большинство компиляторов в конце концов считают ее скрытым параметром может быть 90 делает то же самое для совместимости.

1 голос
/ 07 января 2010

За счет явного заполнения моего C # StringBuilder завершающими пробелами LEN_TRIM вел себя как ожидалось. Эта Microsoft KB , похоже, связана.

Странно, однако, что в отладчике завершающие пробелы появились еще до того, как я сделал явное заполнение.

1 голос
/ 07 января 2010
sbo@dhcp-045:~ $ ./a.out 
 INPUT LEN_TRIM =            7
 DIRECTORYLEN_TRIM =            7
sbo@dhcp-045:~ $ more test.f90 
SUBROUTINE SETPATHS(INPUT)

CHARACTER*20 INPUT
CHARACTER*20 DIRECTORY

DIRECTORY = 'ABCDEFG'

WRITE(6, *) 'INPUT LEN_TRIM = ', LEN_TRIM(INPUT)
WRITE(6, *) 'DIRECTORYLEN_TRIM = ', LEN_TRIM(DIRECTORY)

END SUBROUTINE
program test
    character*20 foo
    foo = "ABCDEFG"
    call setpaths(foo)
end program

Какой компилятор вы используете? здесь гфортран.

Пробовал также с ифортом

$ ifort -v
Version 8.0
$ ifort test.f90
$ ./a.out 
 INPUT LEN_TRIM =            7
 DIRECTORYLEN_TRIM =            7

Я не знаю, как интерфейс C # может создавать проблемы, но семантика LEN_TRIM довольно проста ... если вы говорите, что строки выглядят одинаковыми в отладке, происходит нечто очень подозрительное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...