Есть ли возможность делать функции с переменным количеством параметров разного типа как Printf(argument, ...)? - страница 2

 
Вадим Калашнков:
В C/С++ такая возможность есть. В MQL5 внутри по всей видимости, такая возможность тоже есть. Но есть ли такая возможность для пользователя?

Так не устроит?

struct M_DOUBLE
{
  int cnt;
  double a_values[];
};
struct M_STRING
{
  int cnt;
  string a_values[];
};
struct A_PARAMS
{
  M_DOUBLE m_double;
  M_STRING m_string;

}a_params;

bool ReadParam(A_PARAMS& params)
{
  return(false);
}
 
Вадим Калашнков #:

Шаблоны проектирования как раз таки призваны упростить структуру кода, повысить читаемость и уменьшить количество ошибок. Передавать любое количество параметров нужно например, при отправке сообщения, обертки над принтом для перенаправления/отключения вывода, форматирования и прочего. Если отойти от MQL - то такой функционал, например на C++, нужен для передачи опций при запуске другого бинарника, когда количество опций заранее неизвестно. Формирование же массива опций и его передача разрушает целостность строки при чтении и усложняет анализ кода. Никто не говорит об использовании функций телескопов в иных местах. 64 параметра - это всего лишь достаточный предел, который способен удовлетворить любую подобную задачу.

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

 
Алексей Барбашин #:

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

Еще раз. Вопрос в использовании функций для форматированого вывода. Т.е. аналог Print. 

 
Алексей Барбашин #:

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

Спасибо за объяснение моего кода

 
Valeriy Yastremskiy #:

Костыли только. Даже делал на 64 параметра. Но писать еще больше пришлось в коде. Отказался.

Через массив делали? Я в других языках видел такие возможности, но пригодилось только раз, когда работал с приемом битового потока.

 
Вадим Калашнков #:

Еще раз. Вопрос в использовании функций для форматированого вывода. Т.е. аналог Print. 

Для форматированного вывода в консоль, есть функция PrintFormat

Для получения форматированной строки, есть функция StringFormat

Документация по MQL5: Общие функции / PrintFormat
Документация по MQL5: Общие функции / PrintFormat
  • www.mql5.com
PrintFormat - Общие функции - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Roman #:

Для форматированного вывода в консоль, есть функция PrintFormat

Для получения форматированной строки, есть функция StringFormat

Реч не идет о том, какие функции для форматирования есть. Об этом всем прекрасно изветсно. Если бы этого было достаточно - этой темы тут не было бы. Данные функции не могут обеспечить форматирования пользовательских типов, подрезку ненужной информации enum (например, мне нужно выводить H1 вместо PERIOD_H1), а так же отключать вывод в зависимости от параметра Verbose. Вставлять проверку уровня Verbose перед каждым PrintFormat верх идиотизма.

 
Вадим Калашнков #:

Данные функции не могут обеспечить форматирования пользовательских типов

Зачем использовать пользовательские типы? Для своего удобства? 
Ну так откажитесь от пользовательских типов, в пользу дальнейших возможностей.

подрезку ненужной информации enum (например, мне нужно выводить H1 вместо PERIOD_H1)

void OnStart()
{
   Print(StringSubstr(EnumToString(PERIOD_H1), 7));
   
} 
H1


Для ускорения доступа, можно все периоды описать в switch конструкции.

string GetPeriod(ENUM_TIMEFRAMES period)
{
   string res = ""; 

   switch(period) 
   { 
      case PERIOD_M1: 
         res = "M1"; break; 
      case PERIOD_M2: 
         res = "M2"; break; 
      
      //и т.д.
   } 
   return(res);
}
void OnStart()
{   
  Print(GetPeriod(PERIOD_M1));
}
M1


По другим вопросам тоже наверно найдутся решения, при должном подходе.
Может лучше просто по другому спроектировать задачу.

 
Roman #:

Задача спроектирована, решение найдено, к чему эти комменты вообще?

 
Andrei Trukhanovich #:

Задача спроектирована, решение найдено, к чему эти комменты вообще?

Кхм. Как бы не видно поста об этом Вадимом.
Типа всем спасибо, решение найдено.
А своё возмущение оставь при себе, не с тобой было общение.

Причина обращения: