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

[Удален]  
A100 #:

С точки зрения MQL здесь нет ошибки - есть неявное приведение указателя к объекту:

(*) равносильна записи в две строки:

И если даже пользователи с опытом не могут элементарно этого понять, то что уже говорить о начинающих, что лишний раз подтверждает ошибочность Вашего утверждения:

Не равносильна. В первом случае вызывается не operator=(), а конструктор.

И не конструктор класса A, а конструктор указателя, который должен принимать только указатель.

В MQL конечно есть неявное приведение указателя к объекту, но при инициализации указателя этого делать ни в коем случае нельзя!


 

Win 10, MT5 build 4136 (it would be nice it this info could be copied from the about window..)
(Было бы неплохо, если бы эту информацию можно было скопировать из окна about...)

Strange problem.

I have defined an artificial symbol with artificial quotes and tick volumes (Lane 00 Straight.csv, attached).

In the beginning I the chart shows the tick volume (max 140, min 60) but now it is gone after I entered a channel with upper line at 1.6 and lower line at 0.8 ??

Странная проблема.

Я определил искусственный символ с искусственными котировками и тиковыми объемами (Lane 00 Straight.csv, прилагается).

Вначале на графике отображался тиковый объем (max 140, min 60), но теперь он пропал после того, как я вошел в канал с верхней линией на 1.6 и нижней на 0.8 ?


I deleted the channel but the tick volume does not come back?

PS. The idea for this is not trading, it's more a beginning of a game ... ;)

Я удалил канал, но тиковый объем не вернулся?
PS. Идея для этого не торговая, это скорее начало игры... ;)

Файлы:
 

Неправильно работает примагничивание при рисовании трендовой линии. Примагничивание уводит точку (1) вправо от бара. Причем посередине между барами.

Пробовал задать значение в свойствах линии, немного работает правильно, но потом (когда перемещаю точку 2) самопроизвольно отскакивает в сторону.

Нарисовать линию

 
Koldun Zloy #:

Не равносильна. В первом случае вызывается не operator=(), а конструктор.

И не конструктор класса A, а конструктор указателя, который должен принимать только указатель.

В MQL конечно есть неявное приведение указателя к объекту, но при инициализации указателя этого делать ни в коем случае нельзя!

1. У указателя нет конструктора

2. Неявное приведение не спрашивает у Вас разрешение (можно\нельзя) - оно либо есть - либо нет

3. И где пример подтверждающий Вашу теорию? - мой пример вот:

class A {};
void OnStart()
{
    A *a1 = new A;
    A *a2 = *a1; //нормально
}

Если бы компилятор не смог создать код, то он выдал бы ошибку

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

A100, 2024.01.17 07:34

И если даже пользователи с опытом не могут элементарно этого понять, то что уже говорить о начинающих, что лишний раз подтверждает ошибочность Вашего утверждения:

Вот еще поясняющие примеры:
class A {};
void OnStart()
{
   A *a = 0 ; //(1)//Error: '0' - parameter conversion not allowed
}
class A { public:
    void operator=( int ) {} //(*)
};
void OnStart()
{
   A *a = 0; //(2)//нормально
}

В 1ом случае компилятор сообщает об ошибке, а во 2ом - нет. Почему? Да потому, что во 2ом вызывается (*) путем неявного приведения указателя к объекту. А то, что в данном случае это некорректно - это вопрос уже не к компилятору, а к пользователю

[Удален]  
A100 #:

1. У указателя нет конструктора

2. Неявное приведение не спрашивает у Вас разрешение (можно\нельзя) - оно либо есть - либо нет

3. И где пример подтверждающий Вашу теорию? - мой пример вот:

Если бы компилятор не смог создать код, то он выдал бы ошибку

В этом и ошибка, что ошибка должна быть, а её нет.

Эта тема как раз для сообщений об ошибках.


 
Koldun Zloy #:

В этом и ошибка, что ошибка должна быть, а её нет.

Эта тема как раз для сообщений об ошибках.

Доказательства нужны, что должна быть ошибка, а не просто слова

Выше я привел пример, который все объясняет

[Удален]  
A100 #:

Доказательства нужны, что должна быть ошибка, а не просто слова

Выше я привел пример, который все объясняет

Я бы этот пример разложил на другие две строки:

A a;

A* a1 = &a;
Это правильнее, так как operator=() вызывается для уже созданного объекта.
И получается, что мы создаём временный объект, назначаем его адрес переменной a1, и сразу его уничтожаем.

В C++ мы можем создать переменную типа ссылка.

Фактически это тот же указатель, который ведёт себя как объект, но не при инициализации.

В MQL неявное разыменование указателя превращает его в ссылку.

Поэтому логично что он будет вести себя так же.

Для однозначности нужно просто запретить неявное разыменование указателя при создании указателя.
Так же как для ссылки в C++.

 
b4127, это правильно, что компилятор не ругается?
void OnStart()
{
  int i1 = 1.0; // OK
  int i2 = 1.1; // truncation of constant value
  
  Print(typename(1.0)); // double
}
 
fxsaber #:
b4127, это правильно, что компилятор не ругается?

Правильно:

void OnStart()
{
    Print(1.0==int(1.0)); //(1)
    Print(1.1==int(1.1)); //(2)
}

потому, что в (1) случае результат true, а во (2) - false