Передача массивов данных из MQL4 в DLL и обратно

 

Стоит задача обмениваться с DLL "массивами" данных различных типов. Например, отправить аргументом в функцию DLL calculate(arg1) такой массив:

  1. 2014-01-23 11:03:00
  2. "Карл у Клары украл кораллы"
  3. -1.64234
  4. 1.64245
  5. 100500
  6. True
  7. False
То есть, массив данных различного типа нужно отправить как значение аргумента arg1. Следовательно, этот нужно эти разнотиповые данные упаковать в какой-то универсальных тип (очевидно, массив строк) с мета-информацией. Например:

string data[8];
data[0] = "datetime,string,double,double,integer,bool,bool";
data[1] = "Карл у Клары украл кораллы";
data[2] = "2014-01-23 11:03:00";
data[3] = "-1.64234";
data[4] = "1.64245";
data[5] = "100500";
data[6] = "1";
data[7] = "0";

Прошу порекомендовать решения у тех, кто такую задачу решал. И ответить на следующие вопросы:

  • Есть ли в MQL4 возможность работать со строками длиннее 255 символов?
  • Есть ли символы, которые недопустимо хранить в строках MQL4?
  • Стоит ли пытаться делать это через интерфейс DLL или лучше слать через сокет?

 

Хранить недопустимо "\0" обрезает строку после него, ЕМНИП, с остальными вроде проблем нет.

Передавать строку, принимать указатель на char (wchar_t в новых билдах) если C++. В итоге в дллке будет нормальная 0-строка, с которой можно нормально работать.

Только передавать по одной. Массив строк в новых билдах я не знаю можно ли передать.

 
nevmerzhitsky:

1. Стоит задача обмениваться с DLL "массивами" данных различных типов. Например, отправить аргументом в функцию DLL calculate(arg1) такой массив:

  1. 2014-01-23 11:03:00
  2. "Карл у Клары украл кораллы"
  3. -1.64234
  4. 1.64245
  5. 100500
  6. True
  7. False

2. То есть, массив данных различного типа нужно отправить как значение аргумента arg1. Следовательно, этот нужно эти разнотиповые данные упаковать в какой-то универсальных тип (очевидно, массив строк) с мета-информацией. Например:

string data[8];
data[0] = "datetime,string,double,double,integer,bool,bool";
data[1] = "Карл у Клары украл кораллы";
data[2] = "2014-01-23 11:03:00";
data[3] = "-1.64234";
data[4] = "1.64245";
data[5] = "100500";
data[6] = "1";
data[7] = "0";
3. Прошу порекомендовать решения у тех, кто такую задачу решал. И ответить на следующие вопросы:
  • Есть ли в MQL4 возможность работать со строками длиннее 255 символов?
  • Есть ли символы, которые недопустимо хранить в строках MQL4?
  • Стоит ли пытаться делать это через интерфейс DLL или лучше слать через сокет?

1. То не массив. Это структура. В MQL4++ это можно без проблем. Уже совсем скоро релиз.

2. Это сейчас можно передавать, как массив специальных структур. Метаквоты придумали. Но с новым релизом их отменяют. Т.е. передавать можно по-старому с новыми проблемами, но лучше перейти на массив указателей на строки, как во всех нормальных языках.

3.

С любой длиной строк можно работать. Почти с любой. Теперь почти до 2 миллиардов символов :-)) Хватит?

Это обычные строки, как везде. Всё можно. Особенно с 3 февраля. Там юникод будет.

Это Вам решать по задаче.

 
TheXpert:

Хранить недопустимо "\0" обрезает строку после него, ЕМНИП, с остальными вроде проблем нет.

Передавать строку, принимать указатель на char (wchar_t в новых билдах) если C++. В итоге в дллке будет нормальная 0-строка, с которой можно нормально работать.

Только передавать по одной. Массив строк в новых билдах я не знаю можно ли передать.

Обрезает, конечно, если пользовать просто, как с- строки. Можно рассмотреть это, как массив символов. Т.е. не надеятся на автоматический конец строки по нуль-теминатору. Передавать ещё размер строки (массива). Тогда можно и нуль-терминатор передать.

Кстати, в WinAPI полно функций, где передают или принимают строки через один или два нуль-терминатора в буфер или из буфера известного размера.

 
Zhunko:

Обрезает, конечно, если пользовать просто, как с- строки. Можно рассмотреть это, как массив символов. Т.е. не надеятся на автоматический конец строки по нуль-теминатору. Передавать ещё размер строки (массива).

А вот хз, может и не прокатит. Не экспериментировал.
 
Всем спасибо! Строки обрезаются только когда используется строковая константа в коде, т.е. в коде явно написано "abcdef..." (более 256 символов), тогда будет ошибка при компиляции. На возможность хранить в переменной типа string большее число символов это не влияет (наверняка ограничение есть, но не проверял).
Причина обращения: