Вопрос по типизации - страница 6

 
Насколько я помню, С# плохо дружит с mql
 
Ilya Malev:
Насколько я помню, С# плохо дружит с mql

https://www.mql5.com/ru/forum/285631

10. MQL5: Добавлена нативная поддержка .NET библиотек с "умным" импортом функций. Теперь библиотеки .NET можно использовать без написания специальных оберток — MetaEditor берет это на себя.

Новая версия платформы MetaTrader 5 build 1930: Плавающие окна графиков и .Net библиотеки в MQL5
Новая версия платформы MetaTrader 5 build 1930: Плавающие окна графиков и .Net библиотеки в MQL5
  • 2018.10.25
  • www.mql5.com
26 октября 2018 года будет выпущена обновленная версия платформы MetaTrader 5...
 
Не призываю писать на C#. Просто выгоды от неявного преобразования сомнительны (имхо, сахар, не более), прибыльность стратегий это не увеличивает. Если кто объяснит чем это так поможет при кодинге стратегий - буду рад узнать что-то новое.
 
Vasiliy Sokolov:
прибыльность стратегий это не увеличивает. 

Ссылаться на прибыльность стратегий во время обсуждения техники программирования довольно уныло. 

Vasiliy Sokolov:
Если кто объяснит чем это так поможет при кодинге - буду рад узнать что-то новое.

Так ведь даже свой массив многомерный нормально не сделать. Не говоря даже о массиве с разными типами значений. Даже с одним не сделать, потому что такой код в mql не пролезет:

  Array array;

  double d=123.456;

  array[5]=d;

  d=array[5];

конечно можно тут писать d=array[5].to_double(), делать вид, что так и надо и радоваться своему кривому коду. Но если бы перегрузки операции приведения типа все таки разрешили, вряд ли кто-то предпочел такую запись d=array[5].

 
Ilya Malev:

...

конечно можно тут писать d=array[5].to_double(), делать вид, что так и надо и радоваться своему кривому коду. Но если бы перегрузки операции приведения типа все таки разрешили, вряд ли кто-то предпочел такую запись d=array[5].

Ну прям. d=array[5] можно:

template <typename T>
class MainArray
{
private:
   T m_items[];
   int m_curr;
public:
   MainArray()
   {
      ArrayResize(m_items, 16);
      m_curr = 0;
   }
   void Add(T item)
   {
      m_items[m_curr++] = item;
   }
   T operator[](int index)
   {
      return m_items[index];
   }
};
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   MainArray<double> array;
   array.Add(123.456);
   double v = array[0];
   printf((string)v);
}

Если позанудствовать, то остаются сложности с array[3] = 4.00123; Но и так вполне читабельно и годно.

 
Vasiliy Sokolov:

Ну прям. d=array[5] можно:

Если позанудствовать, то остаются сложности с array[3] = 4.00123; Но и так вполне читабельно и годно.

Ага, d=array[5] можно. но тогда нельзя array[5]=d. Хотя вполне можно вместо = сделать %=. без проблем, заодно значок будет напоминать, через какое место все делается))

 
Ilya Malev:

Ага, d=array[5] можно. но тогда нельзя array[5]=d. Хотя вполне можно вместо = сделать %=. без проблем, заодно значок будет напоминать, через какое место все делается))

Если очень хочется, то можно и так

#property strict

#include <TypeToBytes.mqh> // https://www.mql5.com/ru/code/16280

#define PRINT(A) ::Print(#A + " = " + (string)(A));

void OnStart( void )
{
// Работа со стандартными типами
  color Color = C'241,248,255';

  PRINT(_R(Color)[(uchar)1])             // Green-составляющая цвета - 248

  _W(Color)[2] = (uchar)230;             // Записали по смещению 2 значение (uchar)230.
  PRINT(Color)                           // Убедились, что Color теперь C'241,248,230'

// Работа со строками
  string Str = "abcd";

  _W(Str)[2] = "98765";                  // Побайтовая запись строки в строку со смещением 2
  PRINT(Str)

  string StrArray[] = {"123", "45", "6789"};
  _W(Str) = StrArray;                    // Записали в строку строковый массив
  PRINT(Str)

  _W(Str)[3] = (uchar)0;                 // В байт со смещением 3 записали ноль, тем самым отбрезав строку (длина - 3 ANSI-символа (4 байта))
  PRINT(Str);
}

и т.д.

 
pavlick_:

Я сначала тоже критически отнёсся, а потом подумал - я бы и усебя применение нашёл:

да блин просил я оператор круглые скобки и оператор приведения типа еще года три-четыре назад.

попросите вы, может у вас лучше получится

 
Жаль что тут плюсики к постам нельзя ставить )
 
Ilya Malev:

...

конечно можно тут писать d=array[5].to_double(), делать вид, что так и надо и радоваться своему кривому коду. Но если бы перегрузки операции приведения типа все таки разрешили, вряд ли кто-то предпочел такую запись d=array[5].

Ну и проблемы у людей))) Шоп я так жил!

Между прочим писать d=array[5].to_double() гораздо проще, чем d=(double)array[5] Только точку нажать. Но мы не ищем легкий путей...

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