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

 
Добрый день, с чем может быть связано исчезновение результатов оптимизации в тестере терминалов.  Сохраняется последняя оптимизация, все предыдущие автоматически удаляются. 
 

Добрый день.

В последних версиях терминала появился такой деффект:

Как я понимаю функция SocketSend работает асинхронно. Какой бы большой буффер данных не передавался ей на вход, она сразу возвращает управление, а реальная передача данных происходит фоном для эксперта.

Если в этот момент позвать функцию SocketIsConnected то она возвращает false, при этом в _LastError 0.


Это новое (и на мой взгляд неверное) поведение поломало имеющийся код. Для себя проблему решил отправкой данных маленькими кусками, но хотелось бы услышать мнение кого-то из команды разработчиков.


Спасибо.

Документация по MQL5: Сетевые функции / SocketSend
Документация по MQL5: Сетевые функции / SocketSend
  • www.mql5.com
SocketSend - Сетевые функции - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Ошибка при компиляции, а в другом случае нормально:
class A {
    static int i;
};
A *a1 = new A; //(1) нормально
A  a2;         //(2) Error: unresolved static variable 'A::i'
А какая принципиальная разница между (1) и (2) ?
 
A100 #:
Ошибка при компиляции, а в другом случае нормально: А какая принципиальная разница между (1) и (2) ?

Если объявляете статическую переменную, то следует ее и определить.

class A {
    static int i;
};
int A::i = 0;
A *a1 = new A; // OK
A  a2;         // OK

Попробуйте добавить в класс метод обращающийся к переменной и уже получите ошибку компиляции в коде класса

class A {
    static int i;
    
    void print() { Print(i); } // Error: unresolved static variable 'A::i'
};


А принципиальная разница между вашими случаями (1) и (2) следующая (очень грубо):

Во втором случае вы объявляете глобальную переменную-экземпляр класса. Компилятору необходимо выделить память для нее и всего связанного с классом и здесь же компилятор пытается понять куда указывает имя `A::i`.

А в первом случае вы объявляете глобальную переменную-указатель на экземпляр класса. Здесь компилятору надо выделить память только для указателя, а сам объект будет создан уже в процессе выполнения программы.

 
Ramil.Bagizov #:

Если объявляете статическую переменную, то следует ее и определить.

Определил ниже, почему ошибка не исчезла?

class A {
    static int i;
} *a1 = new A, //(1) нормально
   a2;         //(2) Error: unresolved static variable 'A::i'
int A::i;      //(3)
И в чем тогда уже принципиальная разница между:
class A {
    static int i;
} *a1 = new A; //(1) нормально
int A::i;      //(3)
и
class A {
    static int i;
} a2;         //(2) Error: unresolved static variable 'A::i'
int A::i;     //(3)
???
 
A100 #:

Определил ниже, почему ошибка не исчезла?

До того как Вы определили A::i компилятору нужно создать глобальный экземпляр класса и ему нужно знать куда ссылается A::i. Мне кажется такой ситуации не возникло бы, если бы MQL5 код сначала компилировался в объектные файлы, а потом компоновался в исполняемый (на пример как в С/С++).

А на вопрос про принципиальную разницу я ответил в предыдущем сообщении. Здесь ровно та же самая ситуация в певом случае имеем только указатель на экземпляр (объект) класса, во втором сам экземпляр.

 
Ramil.Bagizov #:

А на вопрос про принципиальную разницу я ответил в предыдущем сообщении. Здесь ровно та же самая ситуация в певом случае имеем только указатель на экземпляр (объект) класса, во втором сам экземпляр.

Возвращаюсь к первоначальному примеру:

class A {
    static int i;
};
A* a1 = new A; //(1) нормально
A  a2;         //(2) Error: unresolved static variable 'A::i'
void OnStart() {}

Почему С\С++ создает исполняемый файл без ошибок, а в MQL ошибка уже на этапе компиляции?

Вы объяснили, почему в MQL возникает ошибка - компилятору чего то там не хватает, а почему в C\C++ всего хватает?
 
A100 #:

Почему С\С++ создает исполняемый файл без ошибок, а в MQL ошибка уже на этапе компиляции?

Потому что компиляторы С/С++ и MQL работают по-разному. Очевидно же :)
 
Ramil.Bagizov #:
Потому что компиляторы С/С++ и MQL работают по-разному. Очевидно же :)

А в чем принципиальная разница работы, применительно к конкретному примеру?

class A {
    static int i;
};
A* a1 = new A; //(1) нормально
A  a2;         //(2) Error: unresolved static variable 'A::i'
void OnStart() {}

Чем MQL компилятор хуже C\C++ ?

 
Ramil.Bagizov #:

До того как Вы определили A::i компилятору нужно создать глобальный экземпляр класса и ему нужно знать куда ссылается A::i. Мне кажется такой ситуации не возникло бы, если бы MQL5 код сначала компилировался в объектные файлы, а потом компоновался в исполняемый (на пример как в С/С++).

А на вопрос про принципиальную разницу я ответил в предыдущем сообщении. Здесь ровно та же самая ситуация в певом случае имеем только указатель на экземпляр (объект) класса, во втором сам экземпляр.

Вообще-то, адрес, по которому разыменовывать A::i  компилятору известен))) Ну, конечно, если это С++))). Требование инициализации статических полей класса происходит из того, что Declaration of a non-inline (since C++17) static data member inside a class definition не является definition. https://en.cppreference.com/w/cpp/language/definition На лицо, явный баг компилятора.
Причина обращения: