Erros, bugs, perguntas - página 2520

 

E não há engano

Это_новая_форма_комментария;
void OnStart() {}
 

Erro durante a compilação

void f() {} //Error: 'f' - function must have a body
void f();
void OnStart()
{
        f();
}

Caso contrário:

void f() {}
void OnStart()
{
        f();
}

Está bem. Qual é a diferença?

Além disso, o C++ compila normalmente num só passe:

#ifdef __cplusplus
void f( int ) {}   //была функция
//...
void f( int = 1 ); //уточнили параметры по умолчанию
void OnStart()
{
        f();       //вызвали
}
#endif
 
E não há erro de compilação... Tudo o que resta fazer é adivinhar o resultado:
int f( int     ) { return 1; }
//...
int f( int = 2 );
int f( int     ) { return 3; }
void OnStart()
{
        Print( f( 0 ));
}
 

Advertência pouco clara sobre a compilação

//lib.mqh //объявления
void f(); //Warning: no #import declaration
//lib.mq5 //реализация
void f() {}
//Test1.mq5 //собираем все вместе
#include "lib.mqh"
#include "lib.mq5"
void OnStart() { f(); }

Caso contrário:

//Test2.mq5
void f();
void f() {}
void OnStart() { f(); }

está tudo bem - não há qualquer aviso. Que diferença é que isso faz?

 
A100:

Aviso pouco claro durante a compilação

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

//lib.mq5 //реализация
void f() {}
Uma gralha com o tipo int, presumo?
 
Alexey Navoykov:
É uma impressão errada com o tipo int, suponho?

Sim... Corrigido em todo o lado para o vazio - por simplicidade.

Por outro lado, o significado, mas já os avisos (*) não são claros

//lib.h //объявления
int g();  //Warning: no #import declaration //(*)
void f(); //Warning: no #import declaration
lib.h é um ficheiro de declaração geral, enquanto lib.mq5, lib2.mq5, lib3.mq5... ficheiros com implementações, que são incluídos por meio de #incluir conforme necessário. Assim, pode não haver qualquer implementação int g() numa determinada construção, mas o aviso obscuro está lá. De facto, existem centenas delas e impedem que se veja avisos realmente importantes
 
A100:

Sim... Corrigido em todo o lado para o vazio - por simplicidade.

Por outro lado, o significado, mas já os avisos (*) não são claros

lib.h é um ficheiro comum com declarações, enquanto lib.mq5, lib2.mq5, lib3.mq5... ficheiros com implementações, que são ligados através de #incluir conforme necessário. Assim, pode não haver qualquer implementação int g() numa determinada construção, mas o aviso obscuro está lá. Na verdade, há centenas deles, e eles dificultam a visão de avisos realmente importantes.

Note que mesmo que escreva uma implementação no mesmo livro de inclusão, este aviso também irá aparecer.

 

O erro seguinte merece uma atenção especial:

//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();
}

Essencialmente semelhante a este, mas com muitos ficheiros, bastante pouco óbvios e difíceis de compreender

 
Pode dizer-me como C++ funciona com isto?
struct A
{
  int i;
};

struct B : public A
{
  string Str;
};

void OnStart()
{
  A a = {0};
  B b;
  
  b = a; 
  a = b; // OK
}
Pergunto-me se devo ou não utilizar esta funcionalidade no meu código. Se funcionar em C++, vou utilizá-lo. Não, penso que não, porque pode ser cancelado nas próximas construções.
 
É um erro o facto de não haver um aviso de inicialização?
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
}
Razão: