Fortran упрощает запись на нескольких языках

avatar
narsonalin
1 июля 2021 в 15:48
102
0
1

У меня есть код, который пишет много сообщений следующим образом:

    select case(params%langue)
    case('english')
        write( *, 1124 ) dt_old, dt_new
        write( 2, 1124 ) dt_old, dt_new
1124    format(/,'adjustement of the time step:', &
            /, 'previous dt=',es10.3,', new dt=',es10.3)
    case default
        write( *, 124 ) dt_old, dt_new
        write( 2, 124 ) dt_old, dt_new
124     format(/,'ajustement du pas temps:', &
            /,'ancien dt=',es10.3,', nouveau dt=',es10.3)
    end select

Сообщения могут быть более или менее сложными, включать целые или вещественные числа, как указано выше, или быть простыми строками, но структура всегда одна и та же: 4 оператора записи и 2 определения формата.

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

Мой вопрос: есть ли способ модернизировать или упростить этот способ записи?

Я подумал о том, чтобы определить весь формат где-то в коде, а затем передать метку формата функции, а также переменные, которые должны быть напечатаны, если они есть. Однако после некоторых исследований кажется, что нет такой вещи, как передача метки формата функции в Фортране и передача неизвестного количества переменных неизвестного типа. Вы можете мне помочь?

Изменить 1:

Точность того, что я хотел бы иметь:

Я хотел бы иметь возможность заменить приведенный выше код чем-то вроде этого:

1124    format(/,'adjustement of the time step:', &
            /, 'previous dt=',es10.3,', new dt=',es10.3)
124     format(/,'ajustement du pas temps:', &
            /,'ancien dt=',es10.3,', nouveau dt=',es10.3)

        call dialog( 1124, 124, old_dt, new_dt )

где подпрограмма dialog принимает две метки формата в качестве аргумента и, возможно, некоторые дополнительные переменные, которые должны быть включены в сообщение.

Источник
Vladimir F Героям слава
1 июля 2021 в 15:50
0

Добро пожаловать, пожалуйста, пройдите приветственный тур и прочитайте Как спросить. Ваш вопрос достаточно открытый. На самом деле это может быть более актуально на codereview.stackexchange.com Мне не очень ясно, какую модернизацию вы имеете в виду.

Ian Bush
1 июля 2021 в 15:55
0

Не уверен, что я полностью понимаю, что вы хотите. Ярлыки формата, да и вообще все ярлыки, очень старомодны. Есть ли что-то неправильное в том, чтобы создать формат как символьную переменную и использовать ее, полностью отказавшись от метки?

Ian Bush
1 июля 2021 в 17:08
0

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

narsonalin
1 июля 2021 в 17:19
0

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

Scientist
2 июля 2021 в 03:49
0

Упростит ли дескриптор g0 edit дескриптор для вашего варианта использования? просто определите общий формат, например character(*), parameter :: format = "(*(g0.3,:,' '))", и используйте его везде.

narsonalin
2 июля 2021 в 18:25
0

Хорошо, я посмотрю на это.

roygvib
4 июля 2021 в 03:30
0

Согласно этому объяснению («Я думал об определении всего формата где-то в коде, а затем передать метку формата в функцию»), есть ли возможность в некоторой степени изменить коды? (Если это так, альтернативным подходом может быть определение массива строк формата и использование индекса массива (а не меток операторов).)

narsonalin
5 июля 2021 в 11:02
0

Да, это тоже было бы решением.

Rodrigo Rodrigues
5 июля 2021 в 20:13
0

Честно говоря, в таком случае я бы выбрал более основательный подход. Определите тип с именем MessageProvider и объявите его модульно-статический объект, чтобы я мог импортировать откуда угодно. В этом типе у меня были бы методы, которые дают мне либо текст сообщения, либо формат для любого из моих сообщений бизнес-кейса. Затем я могу настроить этот объект один раз в начале моей программы, если мне нужен экземпляр с сообщениями на английском, французском или клингонском.

narsonalin
6 июля 2021 в 09:24
0

Я думаю, что я выберу это решение, спасибо!

Ответы (0)