OLP. Problemi di applicazione - pagina 14

 
Yedelkin:

"Invalid pointer access" =="Attempting to access an invalid pointer"? Se sì, allora

Un puntatore può essere non valido nei seguenti casi:

  • il puntatore è NULL;
  • se l'oggetto è stato cancellato usando l'operatore di cancellazione.

Il primo caso è il mio.

Sarei felice di usare CheckPointer() e altri metodi di controllo (sono nato non di mattina), ma strappare l'EA dal grafico non me ne dà la possibilità.

Fammi capire bene - se specifico nel costruttore che il puntatore è uguale a NULL e fermo qualsiasi azione con esso, Expert Advisor otterrà 281 e uscirà (mentre secondo la mia idea non dovrebbe).

Ma se chiamate Init o InitXXX dopo il costruttore (simile a CExpert) , tutto funziona correttamente...

 
Interesting:

La prima opzione è il mio caso.

Sarei felice di usare CheckPointer() e altri metodi di controllo (sono nato lo stesso giorno), ma il crash dell'EA dal grafico non mi dà la possibilità di farlo.

Fatemi capire - se specifico nel costruttore che il puntatore è uguale a NULL e rompo tutte le azioni possibili con esso, EA ottiene 281 e si divide in basso (e secondo la mia idea non dovrebbe).

Ma se chiamate Init o InitXXX dopo il costruttore (simile a CExpert) , tutto funziona correttamente...


Se aveste gestito le eccezioni potreste facilmente capire quale fosse il problema e risolverlo.
 
Interesting:

La prima opzione è il mio caso.

Sarei felice di usare CheckPointer() e altri metodi di controllo (penso di essere nato non ieri), ma strappare l'EA dal grafico non me ne dà la possibilità.

Fammi capire bene - se specifico nel costruttore che il puntatore è uguale a NULL e fermo qualsiasi azione con esso, Expert Advisor otterrà 281 e uscirà (mentre secondo la mia idea non dovrebbe).

Se chiamate Init o InitXXX dopo il costruttore (simile a CExpert) , tutto funziona come dovrebbe...

Non ho ancora avuto a che fare con i metodi Init o InitXXX, ma interpreterei "EA che viene tirata giù" di per sé come segue: il programma a runtime si scontra con un puntatore errato e dobbiamo cercare questo collo di bottiglia nel codice. Anche il mio costruttore inizializza un puntatore a NULL, ma nulla vola fuori.

Se ho capito male la domanda, scusate.

 
Interesting:

Grazie, ora tutto è al suo posto. Ma c'è un'altra domanda: supponiamo che si verifichi l'errore 281, ma è auspicabile che l'EA non venga scaricato. Come dovremmo comportarci?

Lasciami chiarire la mia domanda: cosa fare se l'errore 281 si verifica dopo tutti i passi dell'inizializzazione, ma non influenzerà il lavoro principale dell'Expert Advisor in modo abbastanza critico da non farlo funzionare affatto?

Non ci sarà nessuna gestione delle eccezioni.

C'è solo una via d'uscita: non usare puntatori errati.

Se c'è una possibilità (diversa da zero) che un puntatore possa essere sbagliato, assicuratevi di controllarlo prima di usarlo.

 
uncleVic:

Non ci sarà nessuna gestione delle eccezioni.

L'unica via d'uscita è non usare puntatori non validi.

Se c'è una possibilità (diversa da zero) che un puntatore possa essere sbagliato, assicuratevi di testarlo prima di usarlo.


C'è SEMPRE una possibilità (diversa da zero) che un puntatore possa essere non valido!

Perciò dovete sempre controllare la sua validità prima di OGNI utilizzo! Non solo dopo la creazione.

Non sempre, ma è quello che faccio nei punti critici :(


Oh merda, in cosa si trasforma un puro codice trasparente :) quando si usa la tua raccomandazione.

 
Yedelkin:

Non ho ancora avuto a che fare con i metodi Init o InitXXX, ma interpreterei il "togliere EA dal grafico" in sé come segue: il programma durante la sua esecuzione si imbatte in un puntatore errato ed è questo collo di bottiglia nel codice che deve essere cercato. Anche il mio costruttore inizializza un puntatore a NULL, ma nulla vola fuori.

Se ho frainteso la domanda, mi dispiace.

Se state parlando della classe CExpert, dovete chiamare almeno Init(...). Tutti i puntatori lì sono inizializzati come puntatori a oggetti di classi base...
 
falkov:

C'è SEMPRE una possibilità (diversa da zero) che un puntatore possa essere non valido!

Quindi dovreste sempre controllare la sua validità prima di OGNI utilizzo!

Non sempre, ma nelle aree critiche sì :(


Porca puttana, in cosa si trasforma un puro codice trasparente :) quando si usa la tua raccomandazione.

Alternativa: avere un codice pulito e trasparente che vola via su Invalid pointer?
 
uncleVic:
Alternativa: avere un codice pulito e trasparente che fallisce su Invalid pointer?

Alternativa: avere un codice pulito e trasparente.

Su Invalid pointer e altre situazioni eccezionali (mancanza di corrente, spazio su disco, ecc. situazioni ESCLUSIVE) il programma va nel blocco di gestione delle eccezioni, dove l'Interessato rispettato (e anche io :) potrebbe stampare i valori delle variabili e l'errore, analizzare la situazione e capire qual è il problema. E, se non c'è nessuna reazione a ciò che è successo in questo blocco, lasciate perdere.

Naturalmente, questo non invalida i controlli standard e necessari. Questo è applicabile SOLO in SITUAZIONI ECCEZIONALI.

 
uncleVic:
Se è la classe CExpert, dovete chiamare almeno Init(...). Tutti i puntatori lì sono inizializzati come puntatori a oggetti di classi base...

Per esempio, se Init o InitXXX viene eseguito con un errore (restituisce false), cosa succede?

O cosa fare se durante l'esecuzione l'EA riceve ancora 281 (nonostante tutti i controlli e i trucchi), ma non c'è nessun trader in giro?

È un po' così:

Se aveste gestito le eccezioni, potreste facilmente capire cosa c'era di sbagliato e gestire la situazione.

I controlli ci sono quasi ad ogni passo, ma purtroppo l'elaborazione non c'è...

PS

Quindi, a proposito dell'EA che cade dal grafico - cosa fare per rendere l'EA "vivo" in qualsiasi inizializzazione?

 
uncleVic:
Alternativa: per avere un codice pulito e trasparente, che va in crash per Invalid pointer?

Bene, questo è il punto che vola fuori, lasciate che sia "io" a decidere in questo caso se l'esperto deve essere tirato giù o no.

Dopo tutto, non stiamo nemmeno parlando di un puntatore "rotto" applicato da qualche parte, anche se personalmente ho un controllo prima di applicarlo (anche se posso implementare un altro controllo nel timer).

Ho in qualche modo imparato a vivere in armonia con gli indicatori e non mi importa molto dei risultati dell'inizializzazione, ma non posso fare amicizia con i puntatori.

Yedelkin:

Non ho ancora avuto a che fare con i metodi Init o InitXXX, ma interpreterei "EA dumping" come segue: il programma a runtime si imbatte in un puntatore errato e questo collo di bottiglia deve essere cercato nel codice. Anche il mio costruttore inizializza un puntatore a NULL, ma nulla vola fuori.

Se ho frainteso la domanda, mi scuso.

Attualmente, per risolvere il problema sto restituendo 0 nel blocco di inizializzazione.

int OnInit()
{
//----------------------------------------------------------------------------//

//Processing process of the initialization

//----------------------------------------------------------------------------//
return(0);
//----------------------------------------------------------------------------//
}

Come ho capito è la migliore via d'uscita per me (così EA non andrà in crash all'inizializzazione). Cioè in ogni caso risultato OnInit = 0, non posso giudicare quanto sia corretto.

Motivazione: