Как передать параметры в функцию Mql?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Viktar Dzemikhau
3386
Viktar Dzemikhau  

Я некоторое время писал реализацию для работы с SQLite3. Всё почти написал. Осталось дописать пару обёрток для выполнения команд в удобном виде. Вот возник вопрос по этому поводу. Есть такой вот код:

//==================================================================================================================================================================================
// Insert new row at the end of the table. =========================================================================================================================================
void SQLite3 :: insertRow(string tableName, string& columnNames[]) {
//---
  string sql = "INSERT INTO '" + tableName + "' " +
               "VALUES (?, ?, ?, ?, ?, ?, ?)";

  if (isComplete(sql) != SQLITE_OK) {
    Print("Statement isn't complete. Error = ", getErrorMsg());
    return;
  }
  intptr_t stmtHandle;
  if (sqlite3_prepare(m_dbHandle, sql, stmtHandle) != SQLITE_OK) {
    Print("Statement isn't prepared. Error = ", getErrorMsg());
    return;
  }
  
  uchar instr[1];
  StringToCharArray("GBRJPY", instr, 0, WHOLE_ARRAY, CP_UTF8);

  sqlite3_bind_int(stmtHandle, 1, 3);
  sqlite3_bind_text(stmtHandle, 2, instr, -1, SQLITE_TRANSIENT);
  sqlite3_bind_int(stmtHandle, 3, 240);
  sqlite3_bind_int(stmtHandle, 4, 2);
  sqlite3_bind_double(stmtHandle, 5, 11.30);
  sqlite3_bind_double(stmtHandle, 6, 1.28236);
  sqlite3_bind_double(stmtHandle, 7, 0.3);

  if (step(stmtHandle) != SQLITE_DONE) {
    Print("Executing statement was failed. Error = ", getErrorMsg());
    return;
  }
  sqlite3_finalize(stmtHandle);
}

Оно работает всё замечательно. Но как видно, здесь функция заточена под канкретную таблицу с канкретными колонками и её типами соответственно. А  это есс-но не вариант. Ведь нужен минималистический фреймоврк для работы с любыми таблицами и любыми типами.

В Java я сделал бы всё просто. Передал бы в функцию массив объектов, а внутри получил бы тип каждого члена посредством рефлексии. Всё элементарно. В Mql я хз как поступить. Уже пару часов думаю. Придумал какие-то грабли. Запросы выкидывать за пределы метода тоже не вариант. Нарушится инкапсуляция. Какие могут быть вообще здесь варианты?

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

Т.е. мне нужно передать все эти выделенные аргументы в эту функцию массивом, т.к. заранее типы и количество аргументов не известно. Как это сделать в Mql? Обычный массив не катит т.к. у него тип канкретный, а нужно передавать аргументы разных типов (string, double, int..)

Artyom Trishkin
Модератор
56764
Artyom Trishkin  
Viktar Dzemikhau:

Я некоторое время писал реализацию для работы с SQLite3. Всё почти написал. Осталось дописать пару обёрток для выполнения команд в удобном виде. Вот возник вопрос по этому поводу. Есть такой вот код:

Оно работает всё замечательно. Но как видно, здесь функция заточена под канкретную таблицу с канкретными колонками и её типами соответственно. А  это есс-но не вариант. Ведь нужен минималистический фреймоврк для работы с любыми таблицами и любыми типами.

В Java я сделал бы всё просто. Передал бы в функцию массив объектов, а внутри получил бы тип каждого члена посредством рефлексии. Всё элементарно. В Mql я хз как поступить. Уже пару часов думаю. Придумал какие-то грабли. Запросы выкидывать за пределы метода тоже не вариант. Нарушится инкапсуляция. Какие могут быть вообще здесь варианты?

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

Т.е. мне нужно передать все эти выделенные аргументы в эту функцию массивом, т.к. заранее типы и количество аргументов не известно. Как это сделать в Mql?

Массив объектов CArrayObj
https://www.mql5.com/ru/docs/standardlibrary/datastructures
Viktar Dzemikhau
3386
Viktar Dzemikhau  
Artyom Trishkin:
Массив объектов CArrayObj
https://www.mql5.com/ru/docs/standardlibrary/datastructures

Я думал об этом. Смотрю https://www.mql5.com/ru/docs/standardlibrary/cobject

Как объекту присвоить значение какого-то типа. В справке ни слова. В Java это делается интуитивно при помощи конструкторов. Например, String() имеет много конструкторов под разные варианты. Тоже самое для Double() и  Interger(), например.

В Mql таких вариантов нет. Из объектов только лишь CObject. Но как в него поместить строку или число нет ничего в справке?

Документация по MQL5: Стандартная библиотека / Базовый класс CObject
Документация по MQL5: Стандартная библиотека / Базовый класс CObject
  • www.mql5.com
Класс CObject обеспечивает всем своим потомкам возможность быть элементом связанного списка. Кроме того определяется ряд виртуальных методов для дальнейшей реализации в классах-потомках.
Artyom Trishkin
Модератор
56764
Artyom Trishkin  
Viktar Dzemikhau:

Я думал об этом. Смотрю https://www.mql5.com/ru/docs/standardlibrary/cobject

Как объекту присвоить значение какого-то типа. В справке ни слова. В Java это делается интуитивно при помощи конструкторов. Например, String() имеет много конструкторов под разные варианты. Тоже самое для Double() и  Interger(), например.

В Mql таких вариантов нет. Из объектов только лишь CObject. Но как в него поместить строку или число нет ничего в справке?

Создаёте нужное количество объектов с необходимыми вам полями. Каждый объект должен быть унаследован от CObject. И потом их можно уже помещать в CArrayObj
Viktar Dzemikhau
3386
Viktar Dzemikhau  
Artyom Trishkin:
Создаёте нужное количество объектов с необходимыми вам полями. Каждый объект должен быть унаследован от CObject. И потом их можно уже помещать в CArrayObj

Это понятно. Вопрос в том, как в объект добавить как Вы выразились поле..

Я же внятно выразился. В классе CObject нет методов добавления с его экземпляр значения какого-либо типа. А типовые есть только массивы, т.е. CArray* (CArrayString, CArrayDouble, CArrayInt и т.д.). Но это массивы, мне они не нужны. Хотя у них и только у них есть возможность добавления поля внутрь. А объектов единичных (не массивов объектов) типа C* (CArrayString, CArrayDouble, CArrayInt и т.д.) нет в Mql. Поэтому и вопрос.

Можно, конечно, насоздавать массивов определённого типа, позапихать в них поля, а потом члены этих массивов объектов запихать в массив объектов CArrayObj, но это дичъ полнейшая. Вместо одной строки выйдет целый метод. Так писать как-бы не адекватно. Тогда проще sql-инструкцию вынести из метода, а не выдумывать какие-то костыли. Поэтому и вопрос, как это сделать компакто и красиво.

Vasiliy Sokolov
31095
Vasiliy Sokolov  
Viktar Dzemikhau:

Это понятно. Вопрос в том, как в объект добавить как Вы выразились поле..

void foo()
{
    CArrayLong array_long;
    array_long.Add(12345);
    CArrayString array_string;
    array_string.Add("test");
}
Artyom Trishkin
Модератор
56764
Artyom Trishkin  
Vasiliy Sokolov:
Ему нужен один список разных объектов. Мне с мобилы трудно пример написать.
Viktar Dzemikhau
3386
Viktar Dzemikhau  

Vasiliy Sokolov, Вы меня не поняли. Мне нужно передать посредством одного массива все параметры. А то, что Вы написали,  я и сам использовал.

Вот я накидал:

  CArrayObj *obj = new CArrayObj;
//  obj.Add(new CArrayInt().Add(5));
  CArrayInt *intArray = new CArrayInt;
  intArray.Add(5);
  obj.AssignArray(intArray);    // Здесь ошибка

Хотя, intArray это массив объектов типа int. С чего бы-то вдруг не возможно было в массив объектов его запихнуть вопрос.

Т.е. мне нужно в массив CObject запихать элементы разных типов, как я уже писал выше. А плодить пачку разных массивов не вариант. Потом хз как дальше ими оперировать в другом методе, если не известно заранее количество и типы членов массивов..

Koldun Zloy
762
Koldun Zloy  

Это несложно сделать.

Надо просто прекратить называть Ваши пробелы в знаниях MQL-костылями и начать учиться.

Viktar Dzemikhau
3386
Viktar Dzemikhau  
Koldun Zloy:

Это несложно сделать.

Надо просто прекратить называть Ваши пробелы в знаниях MQL-костылями и начать учиться.

Я же привёл пример как это обычно делается в любых современных языках. Если здесь можно что-то пободное реализовать я буду рад услышать. Правда, на данный момент я вижу, что подобных вариантов здесь нет.

Я повторюсь, если это возможно, я буду рад услышать..

Artyom Trishkin
Модератор
56764
Artyom Trishkin  
Viktar Dzemikhau:

Я же привёл пример как это обычно делается в любых современных языках. Если здесь можно что-то пободное реализовать я буду рад услышать. Правда, на данный момент я вижу, что подобных вариантов здесь нет.

Я повторюсь, если это возможно, я буду рад услышать..

Что, какие поля должен содержать ваш объект?

Объект должен быть унаследован от CObject.

Вы должны иметь несколько объектов, унаследованных от CObject. Каждый объект может содержать любое количество нужных ему полей. И, если все они наследуют свойства CObject, то только тогда их можно все собрать в одном CArrayObj.

Я просто не понимаю, и не знаю вообще, что именно должен хранить каждый из ваших объектов.

Распишите их. Тогда можно придумать нормальную компоновку их массива. Вполне может оказаться, что достаточно иметь один объект с множеством полей, подходящих для разных случаев, а может стоит создать множество объектов CObject, каждый из которых будет применим для своего случая, и различать их можно будет по их типу, который будет им каждому вами присвоен.

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий