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(conststring str) : strB(str) { Print("strB=",strB); }
~B(void){};
};
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+voidOnStart()
{
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?
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?
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.
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.
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
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 :)
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?
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
Mostrami un esempio in modo che non ci sia confusione, poi ti risponderò.
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
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 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?
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.
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 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".
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
che inizializza più velocemente
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 :)
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?
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