Errori, bug, domande - pagina 1183
Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
Quando si testa l'Expert Advisor, genera un errore
takeprofit non valido per la funzione OrderSend
Errore 4107 di OrderSend
Come posso risolvere il problema senza entrare nel codice?
La funzione ZeroMemory non può essere usata per questo oggetto
Capisco, ma perché il compilatore mostra questo errore non in un posto dove si usaZeroMemory, ma in un posto dove la classe è definita? È confuso. Mi sono già scervellato cercando di capire qual è l'errore e dove si trova. Per favore, assicurati che l'errore sia mostrato in un posto giusto. Per esempio, quando si copia un oggetto che contiene elementi che non possono essere copiati, l'errore si verifica esattamente nella linea con la copia e non da qualche parte dentro la classe.
Venendo al lato pratico di tutto questo, ho già incontrato un problema. Il codice usava oggetti statici. Poi ho deciso di sostituirne alcuni con altri dinamici. Come risultato, le operazioni di confronto e di assegnazione hanno iniziato a funzionare in modo molto diverso. E questo problema era difficile da rilevare perché il programma continua a compilare e a funzionare normalmente ma non nel modo in cui dovrebbe.
Non ho capito subito il problema
Da questo si può vedere che (a != a) porta al confronto dei puntatori mentre (a >> a) porta a chiamare l'operatore >>( A* )C'è una contraddizione.
Non potete cambiare il comportamento di (a >> a) come gli altri operatori sovraccaricati (eccetto == e !=) perché renderà impossibile il seguente costrutto, poiché non potete restituire (A) ma potete solo restituire (A*).
Sarà anche impossibile utilizzare completamente gli operatori sovraccaricati perché non esiste un'operazione di conversione puntatore-oggetto (*a)
L'unica cosa rimasta da fare è cambiare il comportamento (== e !=)
Per confrontare i puntatori (== e !=) tra loro e con il numero zero (perché le altre operazioni con i puntatori non hanno senso), si dovrebbe introdurre una funzione speciale come (GetPointer) o specificare esplicitamente una conversione di tipo al compilatore
Così, la possibilità di utilizzare pienamente gli operatori sovraccaricati sarà preservata e la contraddizione sopra menzionata sarà eliminata
L'unica eccezione ragionevole alla regola generale dovrebbe rimanere operator=() perché
eliminerebbe tutte le contraddizioni in una volta sola.
Correzione: in realtà, le contraddizioni sono eliminate solo parzialmente, perché tale notazione (*a) non risolve il problema dell'uso multiplo degli operatori (che ora funziona con successo con tutti gli operatori, tranne == e !=) - quindi il modo migliore per confrontare i puntatori tra loro su uguaglianza/disuguaglianza è ancora utilizzando la funzione speciale - o la conversione esplicita al tipo ulong
questo va bene, e questo
errore di compilazioneContinuando il tema dei puntatori, sarebbe bello aggiungere a MQL l'operatore standard di prendere un puntatore'&', sarebbe molto più comodo e compatto dell'ingombrante GetPointer.Così, avendo gli operatori * e & nel nostro arsenale, saremo in grado di definire esplicitamente le operazioni necessarie:
E c'è di più su questa ampersand. MQL manca di riferimenti alle variabili, soprattutto tenendo conto dell'uso limitato dei puntatori (solo agli oggetti di classe). La funzione richiede spesso l'accesso a un elemento di struttura profondamente annidato o a un array multidimensionale. Devo scrivere il percorso completo ad esso ogni volta, il che rende il codice molto ingombrante.Puoi semplificare le cose creando un riferimento e a volte devi solo "cambiare" il nome di una variabile localmente per comodità. Tuttavia, cosa sto spiegando qui? Tutti sanno già quanto sia conveniente usare i riferimenti, ma ora devi usare #define invece, il che non è certamente buono.
E abbiamo anche bisogno della capacità di passare il risultato di una funzione per riferimento, cioè double& Func() { }
Facebook ha recentemente visto l'emergere del backlinking dei post dai blog:
Restando in tema di puntatori, sarebbe bene aggiungere a MQL un operatore standard per prendere un puntatore'&', sarebbe molto più comodo e compatto dell'ingombrante GetPointer.Così, avendo gli operatori * e &, possiamo definire senza ambiguità le operazioni necessarie:
Adottare solo (*a) per riferirsi alle funzioni membro non dà vantaggi evidenti, ma porta invece all'impossibilità di una semplice e chiara applicazione multipla degli operatori.
Prova a riscriverlo tenendo conto del tuo suggerimento
Non potete usare l'oggetto stesso al posto del puntatore perché l'operatore <<(...) può restituire solo un puntatore all'oggetto.
Quali operazioni con i puntatori sono senza senso? - Solo il confronto tra loro e con un numero - di conseguenza, dovrebbero essere trascurati e messi in una funzione speciale (per esempio, bool ComparePointer( a,b)) per preservare la possibilità di un uso multiplo degli operatori senza il quale l'overload degli operatori stessi perde il suo significato.