Функции с неопределенным количеством аргументов

 

Господа разработчики, здравстуйте!

Подскажите пожалуйста, неужели нельзя реализовывать свои функции вида Func(int lala, ...) с неопределенным количеством аргументов. Так же как работают встроенные Print/FileWrite?

Очень этого не хватает, но в документации ничего подобного нет.

 
diabolo-tm:  реализовывать свои функции вида Func(int lala, ...) с неопределенным количеством аргументов ... как работают встроенные Print/FileWrite?
void OnStart()   // Способ 1.  Параметров много, но им заданы предопределенные значения
{
  Функция(11);
  Функция(22,33);
  Функция(33,44,55);
  Функция(77.11);
}

void Функция(int Парам1=1,int Парам2=2,int Парам3=3,int Парам4=4)
{
   Alert("  Парам1=",Парам1,"  Парам2=",Парам2,"  Парам3=",Парам3,"  Парам4=",Парам4);
}

void Функция(double Парам1=77)  // Способ 2 - Перегрузка
{
   Alert("  Парам1=",Парам1);
}

// Способ 3 - передача параметров через массив + счетчик элементов в массиве 
 
Можно вообще без аргументов обойтись, обрабатывать глобальные переменные.
 
LRA:


Я не про перегрузки функций,  посмотрите на функцию Print, она не знает изначально сколько и какого типа параметров ей передадут. В C это реализовано через Va_arg, но насколько я понимаю реализовать это в mql никто не догадался
 
evillive:
Можно вообще без аргументов обойтись, обрабатывать глобальные переменные.

Вы сами понимаете о чем речь? Или у нас принято операцию на горло делать через задний проход? 
 
Присоединяюсь к вопросу.  Необходимо написать функции на подобие Print. И ведь случайно натыкался  на пример на этом сайте. .А сейчас не как не могу найти.
 
pivomoe:
Присоединяюсь к вопросу.  Необходимо написать функции на подобие Print. И ведь случайно натыкался  на пример на этом сайте. .А сейчас не как не могу найти.

У Print() вовсе не неограниченный набор параметров. Их, вроде бы, 64. То есть тоже есть предел. В качестве аналога делаете функцию с таким же количеством параметров со значениями, заданными по умолчанию.
 
Ihor Herasko:

У Print() вовсе не неограниченный набор параметров. Их, вроде бы, 64. То есть тоже есть предел. В качестве аналога делаете функцию с таким же количеством параметров со значениями, заданными по умолчанию.

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

string Simvol="EURUSD";

string Message;

StringConcatenate(Message,Simvol," НЕТ КОТИРОВОК В СТАКАНЕ Ask=0 Bid=0");

Log.write(Message)

Мне нужно научить Log.write писать в файл произвольное количество параметров произвольных типов. Точно также как Print пишет в журнал. А сейчас как то не хорошо получается. Мне приходиться и переменную   объявлять и фукцию для склеивания вызывать. Вообще как это очень длинно. Хочется вот так.

Log.write(Simvol," НЕТ КОТИРОВОК В СТАКАНЕ Ask=0 Bid=0");
 
pivomoe:

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


Мне нужно научить Log.write писать в файл произвольное количество параметров произвольных типов. Точно также как Print пишет в журнал. А сейчас как то не хорошо получается. Мне приходиться и переменную   объявлять и фукцию для склеивания вызывать. Вообще как это очень длинно. Хочется вот так.

С чужой функцией сделать это будет сложно. А записать самостоятельно ничего не стоит.

Последовательность такая

Открыть файл для записи и чтения

Переместить указатель в конец файла

Запись 1

.........

Запись n

Закрыть файл

Всё...

 

StringFormat не порешит вашу проблему?

Log.write(StringFormat("...",...,...,...));
При каждом конкретном вызове можете передавать "любое" число переменных любого типа, вставленных в произвольный текст
 
pivomoe:

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


Мне нужно научить Log.write писать в файл произвольное количество параметров произвольных типов. Точно также как Print пишет в журнал. А сейчас как то не хорошо получается. Мне приходиться и переменную   объявлять и фукцию для склеивания вызывать. Вообще как это очень длинно. Хочется вот так.

что-же вы так мучаетесь :-)

log<<StringFormat("formatted message %d %d",10,11)<<0.55<<ChartID()<<log.flush

чем не вариант ?

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