Errori, bug, domande - pagina 1172

 

Ci sono errori nella libreria standard di MQL4, in particolare nelle classi di indicatori.

Per la classe CiATR manca il corpo del metodo GetData.

Per gli indicatori che usano parametri del tipo ENUM_APPLIED_VOLUME(CiForce, CiOBV) c'è un errore: l'enumeratore improprio non può essere usato

A proposito, ENUM_APPLIED_VOLUME sembra essere un'enumerazione standard; è presente nella documentazione MQL4, ma in realtà è assente ('ENUM_APPLIED_VOLUME' - identificatore non dichiarato).

Quindi, per favore, controllate tutte le vostre biblioteche. Ho la sensazione che siano stati portati frettolosamente da MT5 senza nemmeno verificare la loro funzionalità.

 

Errore di compilazione, build 966

#property library
#define  CLR     C'255,255,255'//White

class A {
        A() { clr = CLR; }
        color clr;
};
la build 932 va bene
 
A100:
Dopo la sostituzione diretta il codice non si compila a causa del commento
 

dipende dal contenuto del commento

#define  CLR     C'255,255,255'//не White

va bene

 
Beh, non dovrebbe compilare comunque )
 

I commenti non sono mai sostituiti - il compilatore semplicemente li ignora, altrimenti #define nella maggior parte dei casi non potrebbe essere usato con i commenti //

#define  ONE 1 //один
#define  TWO 2 //два

int a = ONE + TWO;
приводит к int a = 1 + 2;
а не к int a = 1 //один + 2 //два;
In ogni caso, sostituite // con /**/ in https://www.mql5.com/ru/forum/1111/page1190#comment_993854
#define  CLR     C'255,255,255'/*White*/

Il risultato è lo stesso: errore di compilazione.

 
In precedenza sulla pagina del profilo di qualcun altro era possibile passare al News Feed (di quell'utente) tramite un link. Ora non vedo tale link, ma se aggiungo /news alla fine dell'URL, questa pagina si apre normalmente. È un bug che il link sia scomparso dall'UI?
 
marketeer:
Si prega di spiegare la seguente situazione. Ho un indicatore multi-valuta, i cui valori non cambiano a seconda del grafico a cui è collegato - calcola i valori per gli strumenti specificati e non è legato alla finestra corrente. Disegno manualmente le linee di supporto e resistenza su questo indicatore. Ora il trucco: se trascino un altro strumento dalla panoramica del mercato nella finestra, l'aspetto dell'indicatore rimane lo stesso e le linee scompaiono. Se apri la finestra di dialogo Object List, quegli oggetti sono ancora elencati lì. I valori degli endpoint (date e valori) rimangono gli stessi (cioè dovrebbero essere visibili negli stessi posti) - è comprensibile, non sono stati cambiati. Tuttavia, le linee non sono visibili. Se poi si trascina sulla finestra lo strumento precedente che era originariamente lì, le linee diventano di nuovo visibili. Qual è il problema?

Trovato e corretto.

Grazie per avermi contattato. Risulta essere un bug generico - ha sempre funzionato così prima

 

Non puoi applicare l'operatore abbreviato !() - errore di compilazione

class A {
public:
        bool operator !() { return ( false ); }
};

bool f1( A* a ) { return ( f3( a ) ); }
bool f2( A* a ) { return ( !a ); }             //ошибка компиляции
bool f3( A* a ) { return ( a.operator!() ); }  //нормально
bool f4( A& a ) { return ( !a ); }

void OnStart()
{
        A *a = new A;
        Print( f1( a ));
        Print( f4( a ));
}

Se il compilatore capisce (e lo fa) che f4( a ) significa che 'a' è un oggetto e non un puntatore/scriptor come un numero)

dovrebbe anche capire che !a' significa la stessa cosa per 'a' (oggetto, non puntatore/numerico)

in altre parole, se

class A {
    void f() {}

void OnStart()
{
        A a1;
        A *a2 = new A;
        a1.f();
        a2.f();
}
a1.f() e a2.f() significano la stessa cosa, sia che a1, a2 sia un puntatore o un oggetto, come può l'operatore !() essere peggiore?
 

Dovrei aggiungere che, per esempio, non c'è nessun errore di compilazione con operator+(), né c'è se aggiungiamo semplicemente operator+(), che non viene usato affatto, al primo esempio sopra

class A {
public:
        bool operator !() { return ( false ); }
        bool operator +() { return ( false ); }
};
ma in questo caso si verifica un'altra incertezza
class A {
public:
        bool operator !() { return ( true ); }
        bool operator +() { return ( true ); }
};

int g( A& a )  { return ( 10 ); }
int g( int )   { return ( 20 ); }

void OnStart()
{
        A *a = new A;
        Print( !a );            //здесь    считает                 'a' - числом ???
        Print( a.operator!() ); //здесь не считает (что правильно) 'a' - числом
        Print( g( a ) );        //здесь не считает (что правильно) 'a' - числом, хотя есть g( int ) и нет g( A* )
}
Motivazione: