Ошибки, баги, вопросы - страница 714

 
victorg:

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

В первом случае должна происходить вставка кода в текущую функцию (наверное), а во втором вызов функции с передачей параметров через стек (наверное). Но в целях оптимизации компилятор может и второй вариант реально реализовывать подстановкой. Так ли это? Я не знаю. Поэтому и спросил.

Это Метаквотов пытать надо. Но мое мнение совпадает с вашим (из-за оптимизации, результат может быть разным).
 

Объект эллипс выделятся мышью, только если кликать по точкам привязки.

Это баг или фича? Очень неудобно реализовано. 

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Способы привязки объектов
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Способы привязки объектов
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы объектов / Способы привязки объектов - Документация по MQL5
 
Вертикальный масштаб, если установлен вручную, не запоминается при перезапуске. Тоже из неприятных мелочей.
 
MetaDriver:

Это что, юмор такой чёрный?

1.  Извини, - бред.  Я понимаю, тут паранойя в моде, и является ломовым аргументом за "почему так не надо делать".  Никакой опасности не вижу в упор. Смотрел внимательно, если чё.  Любое имя, в конечном счёте есть ссылка.  Индексация есть обычное расширение понятия имени. Не более.  Давай запретим присваивание вообще.  В целях безопасности.  Ссылки же крайне опасны так?

2.  Духу объектно-ориентированного программирования, при такой логике, яростно противоречат С++, С#, Делфи, пара дюжин менее популярных языков, в которых индексаторы совершенно нормально работают и справа и слева.  Причём здравому смыслу и моему духу это почему-то не противоречит.

Индексаторы делаются для связи с внешней средой.  Их функция именно интерфейсная.  Я могу инкапсулировать и прятать что угодно, но индексы мне нужны для оперирования объектами как массивами. Фактически все массивы как-то устроены. Например обычные динамические массивы mql. Может запретим их слева от оператора присваивания ставить?  Заменим функцией какой-нибудь типа SetArrayValue(array, i, j, value);  Заодно и в читабельности выиграем. Да и отладка станет куда проще.  Мля. Уф..

3.  А как насчёт того, чтоб сделать нормальный индексатор?  Горничная это конечно классно, но королева всё-таки лучше.

4.  Вот в этом месте у меня крыша конкретно начала ехать.  Это что, нечитабельно??

Вот это читабельнее, да?

  t.setDataElement(i, i*i);

Круто.  Пожалуй пойду лечиться.

5.  Ваще круто.

6. Я плакаль.


e(array, i, j, value);  Заодно и в читабельности выиграем. Да и отладка станет куда проще.  Мля. Уф..

Ну преимущества у сеттера в том что можно делать что-то большее чем тупое приравнивание.

Например можно записывать информацию в лог, конвертировать данные (если речь идет о строках или более сложных данных), уравлять послылать сообщения другим обьектам если произошло какое нибудь важное событие (типа update data).

Kак ваш обьект узнает, что дата изменилась? Судя по всему вы там собираетесь хранить котировки..
А ну да, это ложная провлема, ведь у вас обьект больше как струкрура struct и толком ничем не управляет.
Все делается в другом классе-мусорке который занимается всем чем ни попадя или еще (что хуже) все происходит в onStart(), onTick(), ... ! :)

 

Хорошего вам дня 

 
MetaDriver:

3.  А как насчёт того, чтоб сделать нормальный индексатор?  Горничная это конечно классно, но королева всё-таки лучше.

Мути прокладку. Правда по сравнению с нормальным lvalue будет намного дороже по времени  исполнения. Но выглядеть будет так, как тебе нужно.

______

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

 
speedy:

Ну преимущества у сеттера в том что можно делать что-то большее чем тупое приравнивание.

Например можно записывать информацию в лог, конвертировать данные (если речь идет о строках или более сложных данных), уравлять послылать сообщения другим обьектам если произошло какое нибудь важное событие (типа update data).

Kак ваш обьект узнает, что дата изменилась? Судя по всему вы там собираетесь хранить котировки..
А ну да, это ложная провлема, ведь у вас обьект больше как струкрура struct и толком ничем не управляет.
Все делается в другом классе-мусорке который занимается всем чем ни попадя или еще (что хуже) все происходит в onStart(), onTick(), ... ! :)

 

Хорошего вам дня 

Фишка в том, что индексатор от сеттера по возможностям ничем не отличается. Только намного  более удобным синтаксисом.  Он точно так же реализуется в виде функции, содержимое которой может быть любым (простейший типичный случай - проверка границ массива и отработка прочих ошибок), и совсем не сводится к возвращению ссылки на элемент массива.

Вам тоже хорошего дня.

(Пардон за вчерашний тон.  Был немного на взводе - неприятности на работе. Вы здесь ни при чём. Ну разве уж с категоричностью переборщили :)

Документация по MQL5: Основы языка / Переменные
Документация по MQL5: Основы языка / Переменные
  • www.mql5.com
Основы языка / Переменные - Документация по MQL5
 
TheXpert:

Мути прокладку. Правда по сравнению с нормальным lvalue будет намного дороже по времени  исполнения. Но выглядеть будет так, как тебе нужно.

______

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

На самом деле я думаю, что доделают.  С возвратом ссылок в языке явная недоработка.

Необязательно делать ссылочные переменные, но возврат l-valuе из функций - святое.. :)

Не думаю, что это принципиально нерешаемо - обычные mql-массивы в языке есть и с обеих сторон от оператора присваивания отлично себя чувствуют. Но ведь они по реализации являются классами С++ !  

Вот ещё пример из этой же серии.  Вот этот код компилируется, но не работает.

#define _MyContainer(name,type,size)  struct name { public: type array[size]; type At(int i) {return array[i];} }
#define  ASize 8
#define  BSize 4

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   _MyContainer(MyClass, int, ASize);
   MyClass MyVar;
   Print(sizeof(MyVar)); 
   for(int i=0;i<ASize;i++)
     {
      MyVar.array[i]=i*i;
     }
   for(int i=0;i<ASize;i++)
     {
      Print(MyVar.At(i));
     }
   _MyContainer(My2DBag, MyClass, BSize);
   My2DBag MyVar2D;
   for(int i=0;i<BSize;i++)
     {
      for(int j=0;j<ASize;j++) MyVar2D.array[i].array[j]=(i+1)*(j+1);
     }
   for(int i=0;i<BSize;i++)
     {
      for(int j=0;j<ASize;j++) Print(MyVar2D.At(i).At(j));
// Run-time ERROR:  DefTest (USDJPY,M30)  invalid pointer access in 'DefTest.mq5' (38,46)

//      for(int j=0;j<ASize;j++) Print(MyVar2D.array[i].At(j));
     }
  }

Я это не к тому, что не должен компилироваться.  Я к тому, что должен работать.. :)

 
MetaDriver:

...
Я это не к тому, что не должен компилироваться.  Я к тому, что должен работать.. :)

Да, Вы правы, ошибка компилятора, исправим.
 

В MQL5 есть замечательная константа IS_DEBUG_MODE, относящаяся к группе Прочие константы. Можно ли добавить подобную константу для тестера? Что-то типа IS_TESTER_MODE...

Документация по MQL5: Стандартные константы, перечисления и структуры / Именованные константы / Прочие константы
Документация по MQL5: Стандартные константы, перечисления и структуры / Именованные константы / Прочие константы
  • www.mql5.com
Стандартные константы, перечисления и структуры / Именованные константы / Прочие константы - Документация по MQL5
 
denkir:

В MQL5 есть замечательная константа IS_DEBUG_MODE, относящаяся к группе Прочие константы. Можно ли добавить подобную константу для тестера? Что-то типа IS_TESTER_MODE...

А вот эти константы не подойдут?

ENUM_MQL5_INFO_INTEGER

Идентификатор

Описание

Тип свойства

MQL5_PROGRAM_TYPE

Тип mql5-программы

ENUM_PROGRAM_TYPE

MQL5_DLLS_ALLOWED

Разрешение на использование DLL для данной запущенной программы

bool

MQL5_TRADE_ALLOWED

Разрешение на торговлю для данной запущенной программы

bool

MQL5_DEBUGGING

Признак работы запущенной программы в режиме отладки

bool

MQL5_TESTING

Признак работы запущенной программы в тестере

bool

MQL5_OPTIMIZATION

Признак работы запущенной программы в процессе оптимизации

bool

MQL5_VISUAL_MODE

Признак работы запущенной программы в визуальном режиме тестирования

bool

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