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

 
A100:

Непонятное предупреждение при компиляции

//lib.mqh //объявления
int f(); //Warning: no #import declaration

//lib.mq5 //реализация
void f() {}
С типом int опечатка, я полагаю?
 
Alexey Navoykov:
С типом int опечатка, я полагаю?

Да... исправил везде на void - для простоты. 

С другой стороны так тоже смысл, но уже предупреждения (*) не ясен

//lib.h //объявления
int g();  //Warning: no #import declaration //(*)
void f(); //Warning: no #import declaration
lib.h - общий файл с объявлениями, а lib.mq5, lib2.mq5, lib3.mq5... файлы с реализациями, которые подключаются посредством #include по необходимости. Таким образом реализации int g() в конкретной сборке может и не быть вообще, а непонятное предупреждение - есть. Фактически их там сотни - и они мешают увидеть действительно важные предупреждения
 
A100:

Да... исправил везде на void - для простоты. 

С другой стороны так тоже смысл, но уже предупреждения (*) не ясен

lib.h - общий файл с объявлениями, а lib.mq5, lib2.mq5, lib3.mq5... файлы с реализациями, которые подключаются посредством #include по необходимости. Таким образом реализации int g() в конкретной сборке может и не быть вообще, а непонятное предупреждение - есть. Фактически их там сотни - и они мешают увидеть действительно важные предупреждения

Да, неприятно.  Причём даже если в том же инклюднике прописать реализацию, то предупреждение тоже вылазит.

 

Отдельное внимания заслуживает следующая ошибка:

//lib1.mqh
void f(); //Error: 'f' - function must have a body
#include "lib.mq5"
//...
//lib2.mqh
void f();
#include "lib.mq5"
//...
//lib.mq5
void f() {}
#include "lib1.mqh"
#include "lib2.mqh"
void OnStart()
{
        f();
}

По сути похожа на эту, но при наличии множества файлов довольно неочевидная и труднопостижимая

 
Подскажите, как в C++  с этим?
struct A
{
  int i;
};

struct B : public A
{
  string Str;
};

void OnStart()
{
  A a = {0};
  B b;
  
  b = a; 
  a = b; // OK
}
Задумался, использовать эту фишку в своем коде или нет. Если в C++ работает, буду использовать. Нет - вряд ли, т.к. могут отменить в следующих билдах.
 
Это ошибка, что отсутствует предупреждение об инициализации?
struct A
{
  int i;
};

struct B : public A
{
  string Str;
};

void OnStart()
{
  A a;
  B b;
  
//  b = a; // possible use of uninitialized variable 'a'
  a = b; // OK
}
 

fxsaber:
Подскажите, как в C++  с этим? Задумался, использовать эту фишку в своем коде или нет. Если в C++ работает, буду использовать. Нет - вряд ли, т.к. могут отменить в следующих билдах.

b = a; 
a = b; // OK

Первое присваивание работает только в MQL. И очень плохо, что оно работает.  Хотелось бы, чтоб отменили, наконец, это недоразумение.  Со вторым - проблем нет.

 
Alexey Navoykov:

Первое присваивание работает только в MQL. И очень плохо, что оно работает.  Хотелось бы, чтоб отменили, наконец, это недоразумение.  Со вторым - проблем нет.

Странно. Я считал, что первое работать обязано, а второе - нет.

 
fxsaber:

Странно. Я считал, что первое работать обязано, а второе - нет.

Ну вот видимо и разработчики MQL тоже не совсем понимают суть присваивания. Ибо я им талдычу об этой проблеме уже давно, но как об стену горох.

Суть присваивания в том, что объекту присваивается эквивалентный объект. Т.е. того же типа.  Это значит, что правый объект сначала неявно кастится к типу левого объекта,  а потом уже происходит присваивание (копирование).  И в первом случае естественно такой кастинг (A->B) невозможен.  В C++ будет ошибка.  А в MQL вместо этого левый объект кастится к правому и выполняется A::operator=(A&), замещая лишь часть объекта b.  Разве это присваивание?

Представьте, что вы лонгу присваиваете инт, но происходит только замещение первых четырёх байт, а остальная часть остаётся нетронутой.  Вот здесь то же самое.

 
Alexey Navoykov:

Представьте, что вы лонгу присваиваете инт, но происходит только замещение первых четырёх байт, а остальная часть остаётся нетронутой.  Вот здесь то же самое.

Так это удобно, вроде. В контексте структур, конечно.