экранировать кавычки и удалить двойной перевод строки в фортран написать - PullRequest
0 голосов
/ 05 ноября 2018

Я пытаюсь вывести тривиальное сообщение об ошибке в Fortran90, например так:

error: failed to read '<file>'

Но я не могу понять, как создавать одинарные кавычки, их экранирование приводит к ошибкам компиляции. Я пробовал следующее:

write(*, fmt="('error: failed to read: \'', a, '\'')") arg

Также, если я распечатаю сообщение без них:

write(*, fmt="('error: failed to read: ', a)") file

дополнительный символ новой строки (то есть всего два) создается в командной строке. Я получаю arg, выполняя call getarg(1, arg), возможно, это как-то связано с этим.

Вот минимальный рабочий пример, демонстрирующий проблему перевода строки:

program foo                                                        
    character(len=100) :: arg

    call getarg(1, arg)

    write(*, fmt="('error: failed to read: ', a)") arg
end program foo

Я считаю форматированный вывод на фортране очень не интуитивным, если кто-то может дополнительно направить меня к ресурсу, который объясняет это более подробно, и это было бы здорово.

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Если вы хотите остаться близко к исходному примеру, вот краткое изложение трех исправлений. Я также использовал выделяемую символьную переменную для информации [и потому, что мне нравится эта функция :-)]. Вы можете выбрать исправления самостоятельно.

program foo
  ! always use implicit none at the beginning of a program
  implicit none
  ! use an allocatable character variable. The length can be specified later
  character(len=:), allocatable :: arg
  ! you need a variable to store the length of the argument
  integer :: arg_len

  ! obtain the length of the argument
  call get_command_argument(1, length=arg_len)
  ! allocate the character variable. the length is passed by the type definition of the
  ! allocate statement
  allocate(character(len=arg_len) :: arg)
  ! actually read the argument, finally!
  call get_command_argument(1, value=arg)

  ! the double quotes *inside* the string generate a single quote character
  ! the trim is not necessary here, as the character variable has the appropriate
  ! length. keep it if you stick to a fixed length character variable.
  write(*, fmt="('error: failed to read: ''', a, '''')") trim(arg)

end program foo
0 голосов
/ 05 ноября 2018

Гораздо лучше, на мой взгляд, не вводить напечатанные строки в формат, как вы делаете это в C, а поместить их в список вывода.

Я также рекомендую обрезать имя файла trim(arg) при его печати, чтобы не печатать около 90 бесполезных конечных пробелов.

program foo
    implicit none                                                        
    character(len=100) :: arg

    call getarg(1, arg)

    write(*, '(*(a))') "error: failed to read: '", trim(arg), "'"
end program foo

Таким образом, вам не нужен один внешний слой кавычек, который заключает в себе саму строку формата.

Даже внутри любой строки вы можете повторить кавычку, чтобы поместить ее в строку, т. Е. '' '' (См. Разница между двойными и одинарными кавычками в фортране? )

Кстати, в стандартном Fortran 2003 есть подпрограмма GET_COMMAND_ARGUMENT вместо GETARG.

...