Nano Hash - криптовалюты, майнинг, программирование

избежать кавычек и удалить двойную новую строку в записи на фортране

Я пытаюсь вывести тривиальное сообщение об ошибке в 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

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

04.11.2018

  • Пожалуйста, приведите пример того, как вы вызываете скомпилированную программу и как выглядит вывод: возможно, ваш терминал просто вводит перенос строк. В вашем последнем примере нет ничего, что могло бы вызвать проблему с новой строкой. 05.11.2018

Ответы:


1

Гораздо лучше, на мой взгляд, не вводить печатаемые строки в формат, как это делается в 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.

04.11.2018
  • @HighPerformanceMark Я не хотел слишком сильно менять исходный код. 05.11.2018

  • 2

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

    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
    
    05.11.2018
    Новые материалы

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

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..