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

 
Zeleniy:

Не работает оптимизация.

2014.08.05 19:34:42    Tester    no optimized parameter selected, please check input(s) to be optimized and set carefully start, step and stop values

Перевод ничего не дал.

А как это "ничего"? Уж что-то перевод должен был выдать, вроде того, что нужно выбрать хотя бы один параметр для оптимизации и убедиться, что начало, конец и шаг тестирования заданы верно.
 
marketeer:
А как это "ничего"? Уж что-то перевод должен был выдать, вроде того, что нужно выбрать хотя бы один параметр для оптимизации и убедиться, что начало, конец и шаг тестирования заданы верно.
Как то странно он просто перевел, что я ничего не понял, может я просто устал, тут еще мучаюсь второй день с ошибками. Спасибо, буду опираться от ваших слов.
 

Столкнулся с такой проблемкой.  Нужно сравнивать два объекта одного класса между собой,  решил для удобства перегрузить оператор ==.  Оказалось, что если объекты динамические, то мой оператор не запускается, а вместо самих объектов сравниваются их указатели. Ну это в принципе логично, требуется операция перехода на сам объект по его указателю:   *a == *b.   А в MQL такую возможность сделать забыли. Нужно добавить.

class T {   int x;

public:

T (int value) { x=value; }   bool operator==(T& other) { Print("compare1");  return x==other.x; }   bool operator==(T* other) { Print("compare2");  return x==other.x; } }; //------------------ void OnStart() {   T* a= new T(10);   T* b= new T(10);      Alert(a==b);      delete a;   delete b; }

 

Хотя я сейчас подумал, тот факт что здесь происходит сравнение указателей вместо самих объектов - это в корне неправильно, учитывая специфику языка.  Ведь MQL является управляемым языком, и само понятия "объект" здесь используется независимо от того, как объект расположен в памяти и как к нему осуществляется доступ. Обращение к членам и методам в любом случае идёт через точку. Т.е. тут всё также как в C#.  Соответственно и оператор сравнения должен работать одинаково как для статически выделенных объектов, так и для динамических.   А если нужно сравнить указатели, то это нужно делать используя GetPointer().

 
meat:

Хотя я сейчас подумал, тот факт что здесь происходит сравнение указателей вместо самих объектов - это в корне неправильно, учитывая специфику языка.

Не нужно в MQL придумывать правила сравнения противоречашие С++, до тех пор, пока есть возможность обойтись другими средствами. Если у Вас указатели, а Вам нужно сравнить объекты - используйте функцию сравнения
bool Compare(const T& t1, const T& t2 ) { return ( t1 == t2 ); }

Alert( Compare( a, b ));
Одно дело предложить разрешить запись вида (*a == *b), и совсем другое дело - придать иной смысл записи (a == b)
 

При тестировании советника, выдает ошибку

invalid takeprofit for OrderSend function

OrderSend error 4107

Как можно исправить не влезая в код советника?

 
A100:
Не нужно в MQL придумывать правила сравнения противоречашие С++, до тех пор, пока есть возможность обойтись другими средствами. Если у Вас указатели, а Вам нужно сравнить объекты - используйте функцию сравненияОдно дело предложить разрешить запись вида (*a == *b), и совсем другое дело - придать иной смысл записи (a == b)

Так я же объясняю, что правила MQL и так противоречат С++.  Обращение к объекту по указателю тут осуществляется через точку, а должно быть через ->, если следовать правилам С++.

Т.е. в С++ "указатель" и "объект" - это два совершенно различных понятия, поэтому и синтаксис различный.  Всё строго. А здесь всё смешали в одну кучу. Выглядит будто мы обращаемся к свойствам и методам указателя. Я не говорю что это плохо. Это более удобно для ООП, так же сделано в C# например.  Но тогда нужно и всё остальное реализовывать в таком же ключе.  Должна быть единая концепция.  Иначе возникают противоречия и путаница:  в каких-то случаях мы используем указатель так же, как сам объект, а других случаях указатель вдруг оживает своей жизнью.

Если перейти к практической стороне всего этого, то мне уже пришлось столкнуться с проблемой. В коде использовались статические объекты.  Потом я решил заменить некоторые из них на динамические.  В итоге операции сравнения и присваивания стали работать совсем по другому. И эту проблему было сложно выявить, т.к. программа продолжает нормально компилироваться и работать, но не так, как надо.

 

У меня в коде имеется некий класс, в котором содержится некий объект:

CClass
{
  ...
  CObj  Object; 
  ...
};

Класс CObj объявлен перед этим. 

При попытки компиляции выдаётся ошибка:  'Object' - cannot be unset

Что означает эта ошибка и в чём может быть причина?  Не припомню чтобы раньше встречал такую ошибку.  Конструктор и деструктор у класса CObj имеются.

Попробовал объявить Object просто в виде переменной - всё ок. А вот в составе класса - не хочет.

 
Ну так что, кто-нибудь объяснит, что это за ошибка ("- cannot be unset") ?  В каких случаях она возникает?
 
meat:
Ну так что, кто-нибудь объяснит, что это за ошибка ("- cannot be unset") ?  В каких случаях она возникает?
Для данного объекта нельзя использовать функцию ZeroMemory
Причина обращения: