У меня есть код, который пишет много сообщений следующим образом:
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
принимает две метки формата в качестве аргумента и, возможно, некоторые дополнительные переменные, которые должны быть включены в сообщение.
Добро пожаловать, пожалуйста, пройдите приветственный тур и прочитайте Как спросить. Ваш вопрос достаточно открытый. На самом деле это может быть более актуально на codereview.stackexchange.com Мне не очень ясно, какую модернизацию вы имеете в виду.
Не уверен, что я полностью понимаю, что вы хотите. Ярлыки формата, да и вообще все ярлыки, очень старомодны. Есть ли что-то неправильное в том, чтобы создать формат как символьную переменную и использовать ее, полностью отказавшись от метки?
ОК - вы не можете сделать это с ярлыками. Метка имеет значение только в той области, в которой она находится - вне этой подпрограммы/функции/чего бы то ни было, на нее невозможно сослаться.
Хорошо, я не хочу специально сохранять метки, но я хочу поместить операторы записи в подпрограмму. Ваше предыдущее решение с генератором формата могло быть частью решения, но мне все еще нужно решение для передачи неизвестного количества аргументов с неизвестными типами :)
Упростит ли дескриптор
g0
edit дескриптор для вашего варианта использования? просто определите общий формат, напримерcharacter(*), parameter :: format = "(*(g0.3,:,' '))"
, и используйте его везде.Хорошо, я посмотрю на это.
Согласно этому объяснению («Я думал об определении всего формата где-то в коде, а затем передать метку формата в функцию»), есть ли возможность в некоторой степени изменить коды? (Если это так, альтернативным подходом может быть определение массива строк формата и использование индекса массива (а не меток операторов).)
Да, это тоже было бы решением.
Честно говоря, в таком случае я бы выбрал более основательный подход. Определите тип с именем
MessageProvider
и объявите его модульно-статический объект, чтобы я мог импортировать откуда угодно. В этом типе у меня были бы методы, которые дают мне либо текст сообщения, либо формат для любого из моих сообщений бизнес-кейса. Затем я могу настроить этот объект один раз в начале моей программы, если мне нужен экземпляр с сообщениями на английском, французском или клингонском.Я думаю, что я выберу это решение, спасибо!