Errori, bug, domande - pagina 1356

 
Vasiliy Sokolov:
Molto bello e soprattutto ideologicamente corretto. Due mani a favore!
Allora sarebbe ideologicamente corretto
class A { public:
        bool operator !=( A* ) {}
        bool operator  <( A* ) {}
};
void f()
{
    A *a1, *a2;
    a1 != a2; //здесь простое сравнение указателей вместо вызова operator !=()
    a1 <  a2; //здесь вызывается operator <()
}
operatore!=() verrebbe chiamato invece di confrontare i puntatori all'uguaglianza come avviene ora. E il confronto dei puntatori potrebbe essere eseguito da una funzione speciale simile a ::GetPointer(...)

Ma questo non viene fatto per la semplice ragione che porterebbe notevoli inconvenienti, e il vantaggio sarebbe solo la correttezza ideologica

 
Non ho ricevuto un aggiornamento da un po': MetaTrader5 build 1159 (collegato a MetaQuotes-Demo). Il compilatore di comandi carica la build 1162
 
Vasiliy Sokolov:

Allora la stringa è anche un insieme di numeri specifici. E un'immagine è anche un numero e un impulso elettrico su un chip...

In generale, studiare ingegneria elettrica, collega.

Ecco un confronto tra i puntatori in C++ e i descrittori in MQL/C# e alcuni altri linguaggi.

La sfida: vuoi chattare dal vivo con un amico.

1. Suggerimenti. Conosciamo la via, il numero civico e l'appartamento. Andiamo all'indirizzo, svegliamo l'amico, prendiamo una bolla, lui è eccitato e chiacchiera )).

2. Descrittori. Non conosciamo l'indirizzo esatto, nessuno è autorizzato ad entrare nella casa, per esempio, è l'edificio del FSB. C'è un punto di controllo nella casa, che si rifiuta di dire l'indirizzo per nome di un amico (per descrittore), si rifiuta di far entrare la casa (nello spazio degli indirizzi). La sicurezza chiama l'amico e gli chiede di uscire. Lui esce, tu tiri fuori allegramente la bolla, lui sibila, -che cosa sei!!!! mettila via immediatamente!!! Così tanto per camminare... Camminando verso casa con una bottiglia non aperta in mano, ti rendi conto in modo stridente che i descrittori forniscono sicurezza in cambio di capacità di segnalazione.

 
Vasiliy Sokolov:

In generale, studiare ingegneria elettrica, collega.

Nessun altro argomento?
 
A100:
Nessun altro argomento?
E tu?
 
A100:
Ho frammenti di codice in cui i puntatori sono esplicitamente convertiti in numeri (per interfacciarsi con sistemi esterni di scrittura/lettura, e per l'analisi degli errori e il debug), se questo è vietato allora la flessibilità sarà ridotta e dovrò rifare.
Argomento interessante, ci vuole un po' di tempo per pensarci. Si prega di creare una richiesta, ne discuteremo in dettaglio.
 

A proposito, che ne dite di introdurre gli operatori * e & in MQL per permettere l'accesso esplicito a un oggetto nel primo caso, e prendere un puntatore a un oggetto nel secondo (invece del macchinoso GetPointer). L'asterisco è un must, e non può essere sostituito da nulla nel linguaggio.Senza di esso, è impossibile controllare situazioni come quella descritta da A100 sopra, quando invece degli oggetti stessi vengono eseguite alcune azioni del puntatore. Personalmente, questo è un problema costante, devo stare costantemente all'erta o specificare A.operator=(B), A.operator!=(B) ovunque, cioè si perde la brevità, e l'overloading degli operatori diventa effettivamente senza senso.

Ho già sollevato questo problema una volta, ma l'argomento si è arenato. Finiamo finalmente questo problema.

 

Domanda sulle variabili esterne.

Ho affrontato una situazione in cui la variabile esterna cambia durante l'esecuzione del programma, ma quando il timeframe viene cambiato, riprende il valore impostato nella finestra delle proprietà. Per esempio, se prima dell'inizio imposto TradeEnable a EnableAll e cambio il valore in EnableBuy durante l'esecuzione del programma, allora quando il grafico cambia in un altro timeframe il valore tornerà a EnableAll. Il valore che definisco nell'evento timer e l'output attraverso Comment, non ci può essere alcun errore.

enum ETradeEnable {EnableAll, EnableBuy, EnableSell, DisableAll};
extern ETradeEnable TradeEnable = EnableAll;

La variabile TradeEnable non è influenzata dal capovolgimento dei grafici. Leggete il manuale - A differenza delle variabili di input, i valori delle variabili esterne possono essere cambiati programmaticamente mentre il programma è in esecuzione.

Ecco come sono impostati OnDeinit e OnInit.

Domanda: Non capisco qualcosa o il cambiamento di TradeEnable è un errore di runtime?

int LastDeinitReason = 0;

void OnDeinit(const int reason)
{
    LastDeinitReason = reason;
    if(reason==REASON_CHARTCHANGE || reason==REASON_TEMPLATE || reason==REASON_PARAMETERS)
        return;
    EventKillTimer();
// далее код при завершении работы советника
}

int OnInit()
{
    if(LastDeinitReason==REASON_CHARTCHANGE || LastDeinitReason==REASON_TEMPLATE)
    {
        LastDeinitReason = 0;
        return(INIT_SUCCEEDED);
    }
    if(LastDeinitReason==REASON_PARAMETERS)
    {
        SetParams();
        return(INIT_SUCCEEDED);                              
    }
// далее код инициализации при запуске
}
 
Alexey Navoykov:

Finiamo finalmente questo numero.

Due operatori vi sono sacrificati (== e !=) per preservare tutti gli altri.

Vedo una via d'uscita in uno schema.

template<typename T1, typename T2>
bool IsEqualPointer( const T1 *t1, const T2 *t2 )
{
    return ( ulong(t1) == ulong(t2) );
}

Se operator==(!=) è definito, sarà chiamato. Se non è definito, i puntatori saranno confrontati all'uguaglianza. E se operator==(!=) è definito ed è necessario confrontare i puntatori sull'uguaglianza, questo può essere fatto attraverso il template specificato.

I cambiamenti al sistema esistente sono minimi e la cosa principale è che non influiranno su coloro che semplicemente confrontano i puntatori all'uguaglianza senza sovraccarico operator==(!=).

 
A100:

Due operatori vi sono sacrificati (== e !=) per preservare tutti gli altri.

Vedo una via d'uscita in uno schema.

Se operator==(!=) è definito, sarà chiamato. Se non è definito, i puntatori saranno confrontati all'uguaglianza. E se operator==(!=) è definito ed è necessario confrontare i puntatori sull'uguaglianza, questo può essere fatto attraverso il template specificato.

I cambiamenti nel sistema esistente sono minimi e la cosa principale è che non influiranno su coloro che semplicemente confrontano i puntatori senza sovraccarico operator==(!=).

Naturalmente, potete fare il confronto e l'assegnazione attraverso funzioni separate, ma a che scopo? Il punto è convincere gli sviluppatori a fare una soluzione adeguata.