OLP. Problemi di applicazione - pagina 13

 
TheXpert:
Mostrami un esempio in modo che non ci sia confusione, poi ti risponderò.

//1-ый вариант. Переменная-член strA инициализируется автоматически
class A
  {
public:
   string            strA;
                     A(void) { Print("strA=",strA); };
                    ~A(void){};
  };
//2-ой вариант. Переменная-член strB инициализируется при помощи инициализатора пользовательским значением
class B
  {
public:
   string            strB;
                     B(const string str) : strB(str) { Print("strB=",strB); }
                    ~B(void){};
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
   A a1;
   B b1("Пользовательское значение");
  }

Un esempio è semplice. Supponiamo che 15 "cicli di computer" siano spesi per l'inizializzazione automatica del membro a1.strA. Sono giunto alla conclusione preliminare che 15 cicli sono spesi per inizializzare anche il membro b1.strB. È corretto?

 

Nella classe CExpert della libreria standard, ci sono queste dichiarazioni protette

//--- trading objects
CExpertTrade     *m_trade;    // trading object
CExpertSignal    *m_signal;   // trading signals object
CExpertMoney     *m_money;    // money manager object
CExpertTrailing  *m_trailing; // trailing stops object

Allo stesso tempo, il costruttore di questo oggetto contiene le seguenti stringhe

m_trade    =NULL;
m_signal   =NULL;
m_money    =NULL;
m_trailing =NULL;

Ho provato a creare qualcosa di simile nella mia classe, ma senza ulteriori inizializzazioni (come Init e InitXXX).

Il compilatore ha compilato tutto senza avvertimenti o errori, ma ha avuto un errore critico 281 (Invalid pointer access) e EA è stato cancellato dal grafico.

A questo proposito, ho alcune domande:

1. Cosa dovrei fare nel costruttore (specificare NULL o specificare il puntatore all'oggetto specifico)?

2. L'inizializzazione del puntatore di tipo InitTrade è obbligatoria?

 
Interesting:

Nella classe CExpert della libreria standard, ci sono queste dichiarazioni protette

Allo stesso tempo, il costruttore di questo oggetto contiene le seguenti stringhe

Ho provato a creare qualcosa di simile nella mia classe, ma senza ulteriori inizializzazioni (come Init e InitXXX).

Il compilatore ha compilato tutto senza avvertimenti o errori, ma quando ho provato a installare l'EA sul grafico, ha ottenuto un errore critico 281 (Invalid pointer access) e l'EA è stato cancellato dal grafico.

A questo proposito, ho alcune domande:

1. Cosa dovrei fare nel costruttore (specificare NULL o specificare il puntatore all'oggetto specifico)?

2. L'inizializzazione del puntatore di tipo InitTrade è obbligatoria?

1. Entrambi sono corretti. Tutto dipende dalla particolare implementazione della classe (non specificamente CExpert). Tuttavia, è meglio creare oggetti dinamici nel metodo InitXXX, che restituisce bool (perché il costruttore non restituisce il risultato dell'esecuzione e dovrete resettare il flag di inizializzazione e poi analizzarlo (il flag).

2. Certo che lo è. Altrimenti, si verificherà l'errore critico 281 (Invalid pointer access).

PS. Grazie a proposito. Dovrò inserire dei controlli dei puntatori prima dell'uso.

 
Yedelkin:

Un esempio è semplice. Supponiamo che 15 "cicli di computer" siano spesi per l'inizializzazione automatica del membro a1.strA. Sono giunto alla conclusione preliminare che 15 cicli sono spesi per inizializzare anche il membro b1.strB. È corretto?

No, non sono affatto i tatti. O forse non si tratta davvero dell'orologio.
 
TheXpert:
No, non si tratta affatto dell'orologio. Beh, o non proprio dell'orologio.

OK, allora una domanda molto semplice: quale è più veloce da inizializzare in tempo, il membro a1.strA o il membro b1.strB dell'esempio precedente?

O cosa leggere "punto per punto"? Fisicamente, non c'è modo di imparare la programmazione a livello di "macchina-processore".

 
Yedelkin:

OK, allora una domanda molto semplice: quale è più veloce da inizializzare in tempo, il membro a1.strA o il membro b1.strB dell'esempio precedente?

O cosa leggere "punto per punto"? Non c'è fisicamente un modo per imparare la programmazione a livello di "macchina-processore".

a1.strA si inizializzerà più velocemente perché il suo processo di inizializzazione sta semplicemente azzerando sul posto. Per b1.strB verrà fatta un'allocazione di memoria.

Tuttavia, questa differenza è abbastanza difficile da misurare, poiché è molto meno dell'uno per cento, tenendo conto del codice intorno all'inizializzazione

 
Yedelkin:

che inizializza più velocemente

la domanda non è corretta.
 
stringo:

Per b1.strB verrà fatta un'allocazione di memoria.

Ecco, grazie - l'anello mancante nella mia logica.

TheXpert, grazie per l'aiuto. Ho cercato di spiegare il punto con parole mie. Sono d'accordo che una domanda veramente corretta è posta da coloro che sono nel sapere. Ma di solito non fanno domande del mio livello :)

 
uncleVic:

1. È corretto in entrambi i modi. Tutto dipende dall'implementazione specifica della classe (non specificamente CExpert). Tuttavia, è meglio creare oggetti dinamici nel metodo InitXXX, che restituisce bool (perché il costruttore non restituisce il risultato dell'esecuzione e dovremo reimpostare/disabilitare il flag di inizializzazione e poi analizzarlo (il flag).

2. Certo che lo fa. Altrimenti errore critico 281 (accesso al puntatore non valido).

PS. Grazie a proposito. Dovrò inserire dei controlli dei puntatori prima dell'uso.

Grazie, ora tutto è al suo posto. Tuttavia, c'è un'altra domanda: supponiamo che si verifichi l'errore 281, ma è meglio che l'Expert Advisor non venga scaricato. Cosa devo fare?

Permettetemi di chiarire la mia domanda - Cosa fare se l'errore 281 si verifica dopo tutti i passaggi di inizializzazione, ma non influenzerebbe il lavoro principale di Expert Advisor in modo abbastanza critico da non farlo funzionare affatto?

 
Interesting:

Supponiamo che si verifichi l'errore 281, ma è auspicabile che l'EA non venga scaricato. Cosa dovremmo fare allora?

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

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

Un tentativo di accedere a un puntatore non valido causa un crash del programma. Ecco perché è necessario usare la funzione CheckPointer() prima di usare un puntatore. Un puntatore può essere non valido nei seguenti casi

  • il puntatore è NULL;
  • se l'oggetto è stato distrutto dall'operatore di cancellazione
  • .