Arhn - архитектура программирования

Конкатенация строк в операторе Fortran DATA

Я хотел бы определить некоторые переменные длиной два символа, используя операторы DATA, объединяя две именованные константы, относящиеся к отдельным символам, непосредственно в операторе DATA.

Является ли это возможным? Если да, то каков правильный синтаксис? Есть ли лучший, лаконичный способ сделать это?

Пример

use m_ascii_chars              ! this defines ch_* stuff as single character named constants
...
character(2) :: pairs(100)
...
DATA pair(1) /   ch_plus // ch_verticalbar   /  ! would be the best one, but it does not work,
                                                ! given the meaning of the slash in the DATA
                                                ! statement

DATA pair(1) / ( ch_plus // ch_verticalbar ) /  ! does not work !!
DATA pair(1) / [ ch_plus // ch_verticalbar ] /  ! does not work !!


! This works, but it is rather verbose
DATA pair(1)(1:1) / ch_plus /
DATA pair(1)(2:2) / ch_verticalbar /
...

! Of course, this works too, but does not fit the requirements.
DATA pair(1) / '+|' /

  • Я настоятельно рекомендую прекратить использовать DATA, он действительно устарел. Пожалуйста, покажите более полный пример и объясните, что на самом деле не работает для вас. Есть какое-то сообщение об ошибке или что-то в этом роде? 02.02.2021
  • Я знаю, на самом деле оператор DATA не в моих привычках, и я буду счастлив избегать его использования (как в последней части моего вопроса). Да, компилятор выдает разные сообщения об ошибках в зависимости от (неправильного) синтаксиса, который я использую (не стоит сообщать о них). Я не хочу определять большой массив инициализации, я хотел бы определить каждый элемент, используя только именованные константы. Скажем: ` целое число, параметр :: PLUS_VERTICALBAR = 1 ... пара(PLUS_VERTICALBAR) = ch_plus // ch_verticalbar ... ` Я мог бы сделать это в процедуре инициализации, но я хотел бы сделать это во время компиляции *as используя статус DATA) 02.02.2021
  • @francescalus да, в примере я использовал DATA для пар массивов переменных. Определение пар в качестве параметра (используя другой синтаксис) было бы еще лучше. 02.02.2021

Ответы:


1

Конкатенация символов не может появляться в значении оператора data. Для целей вопроса значение для инициализации переменной должно быть константой. '+' // '|' является константным выражением, но не константой. Заявление

DATA pair(1) / '+|' /

как уже отмечалось, это нормально, потому что '+|' является (буквальной) константой. Аналогично можно использовать именованную константу с этим значением, а в выражении инициализации для именованной константы можно использовать конкатенацию символов (констант):

character(*), parameter :: plusbar = ch_plus//ch_verticalbar
data pair(1) / plusbar /

Как также видно,

DATA pair(1)(1:1) / ch_plus /
DATA pair(1)(2:2) / ch_verticalbar /

работает. Хотя это многословно, это можно записать (немного) более кратко:

DATA pair(1)(1:1), pair(1)(2:2) / ch_plus, ch_verticalbar /

Ваш компилятор может поддерживать неявное выполнение для подстроки, но это нестандартно.

Если вы хотите предоставить начальные значения по частям, то вы застряли с операторами data и здесь не можете использовать конкатенацию строк. Однако, если вы можете предоставить выражение для всего массива, вы можете использовать конкатенацию:

character(2) :: pair(100) = [ch_plus//ch_verticalbar, ...]

Такое выражение может быть громоздким, но у вас есть доступ к различным методам создания этого массива.


Трудность с '+'//'|' связана не с конфликтом синтаксического анализа // с / разделителя. Аналогичные ограничения применяются и к другим выражениям, например, запрет на использование

integer i
data i /1+2/

(и, конечно, 3*2 в списке значений означает 2,2,2, а не 6)

02.02.2021
  • Спасибо за ваш расширенный и очень полезный ответ. 02.02.2021
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..