Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 599
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
Ciao!
Potete dirmi come spostare il cursore su, diciamo, la linea 7 in un documento di testo, per estrarre una sottostringa da questa posizione...
Cos'è più veloce: più file di testo con una riga o un file con più righe?
Dovete sapere quanti byte ci sono in una linea e spostare il puntatore a 6 di questi valori dall'inizio del file.
Ciao!
Cosa è più veloce: molti file di testo con una riga o un file con molte righe?
Dipende dall'implementazione specifica dell'algoritmo e dal problema da risolvere. Forse nel tuo caso, la prima opzione sarà più veloce, ma non penserei alle prestazioni al tuo posto.
Per favore, ditemi come spostare il cursore, diciamo, sulla settima linea in un documento di testo, per estrarre la sottostringa già da questa posizione...
Leggete la documentazione standard. La sezione delleoperazioni sui file. Per esempio, potete leggere un file riga per riga con FileReadString, un esempio è direttamente dalla documentazione:
Potete dirmi come convertire il valore di un clic del mouse su un grafico in un valore di prezzo o viceversa?
Dimmi come convertire il valore di un clic del mouse su un grafico in un valore di prezzo o viceversa.
Usa la funzione ChartXYToTimePrice. Vedere "Operazioni con i grafici" nella documentazione.
Usa la funzione ChartXYToTimePrice. Vedere "Operazioni con i grafici" nella documentazione.
Grazie.
Quindi hanno fatto un errore con CArrayObj. Invece di: CArrayObj test_objects; Hanno scritto: CArrayObj* test_objects, ma hanno dimenticato di fare un distruttore per esso; Forse hanno configurato male il modello di memoria per lavorare con CArrayObj. Forse hanno semplicemente esagerato con i puntatori. La diagnosi è chiara: l'uso di puntatori dove non sono necessari spesso causa perdite.
C'è una funzione in qualche classe. Dichiaro un array di oggetti CArrayObj in esso. Ci aggiungo gli oggetti della classe globale. Quando la funzione è finita, l'array di oggetti in sé non è necessario. Gli oggetti sono necessari, ovviamente.
Se creo l'array come puntatore CArrayObj *test_objects, ottengo oggetti non cancellati nel registro, il che causerà un errore di out of memory alla fine.
Se dichiaro l'array come CArrayObj test_objects, aggiungo oggetti ad esso, poi risulta che quando la funzione finisce e gli oggetti diventano indisponibili, perché l'array con gli oggetti è come cancellato...
Se dichiaro un array come CArrayObj test_objects, aggiungo degli oggetti ad esso, poi risulta che quando la funzione finisce e gli oggetti diventano indisponibili, perché l'array con gli oggetti viene come cancellato...
Questo è corretto, perché in questo caso, mettete CArrayObj test_objects sullo stack e nello spazio di indirizzi della funzione. Quando la funzione esce, lo spazio degli indirizzi della funzione viene sovrascritto, compresi i vostri CArrayObj test_objects.
La funzione è terminata, l'array di oggetti in sé non è necessario. Gli oggetti, ovviamente, sono necessari.
Ricordate una volta per tutte che se avete bisogno di oggetti dentro un CArrayObj, avete anche bisogno del CArrayObj stesso. CArrayObj è un imballaggio obbligatorio. Non puoi farne a meno, punto e basta.
Se creo un array come puntatore CArrayObj *test_objects, allora ottengo oggetti non cancellati nel log, che alla fine porteranno ad un errore di out of memory.
In questo caso viene creato un puntatore a qualche oggetto CArrayObj nell'heap. L'heap è un segmento di memoria dello spazio degli indirizzi del programma dove la memoria viene allocata e cancellata manualmente con l'aiuto dei corrispondenti operatori new e delete. Significa che se si scrive new, ci deve essere la sua copia speculare di delete da qualche parte. Inoltre, il nuovo e l'eliminazione possono essere situati in parti diverse del programma, per esempio, in metodi diversi:
Se, dopo aver chiamato foo_analize, gli oggetti sono ancora necessari, l'operatore di cancellazione può essere messo da qualche altra parte, dove gli oggetti sono garantiti essere necessari. Un tale luogo universale può essere OnDeinit, per esempio, che viene chiamato prima della chiusura del programma.
Ricordate la cosa principale, se c'è un operatore nuovo, ci deve sempre essere un operatore di cancellazione per esso. Altrimenti ci saranno perdite di memoria. Gli operatori new e delete che lavorano sullo stesso oggetto non devono essere "affiancati" nello stesso metodo. La cancellazione può essere ovunque lontano dall'allocazione di memoria, purché la cancellazione abbia un riferimento all'oggetto allocato nell'heap.
** Anche se questo è vero, è meglio evitare tali costrutti perché dobbiamo sempre stare molto attenti a dove e in quali circostanze viene chiamato l'operatore di cancellazione, che non è sempre ovvio. Invece, devi solo imparare a usare le classi. La classe permette di posizionare e cancellare automaticamente gli oggetti sull'heap, senza usare gli operatori new e delete:
Questa classe non contiene esplicitamente dei puntatori. Quindi non c'è bisogno di usare sia new che delete. Dopo l'uscita dal programma, la classe rilascerà tutti gli oggetti CItem e CArrayObj automaticamente, il che rende la vita dello sviluppatore molto più facile.
Questo è corretto, perché in questo caso mettete CArrayObj test_objects sullo stack, e lo spazio di indirizzo della funzione. Quando uscite dalla funzione, lo spazio degli indirizzi della funzione viene sovrascritto, compresi i vostri CArrayObj test_objects.
Ricordate una volta per tutte - se avete bisogno di oggetti dentro un CArrayObj, avete bisogno del CArrayObj stesso. CArrayObj è un pacchetto obbligatorio. Non potete farne a meno, punto e basta.
In questo caso, viene creato un puntatore a qualche oggetto CArrayObj nell'heap. L'heap è un segmento di memoria dello spazio degli indirizzi del programma dove la memoria viene allocata e cancellata manualmente con l'aiuto dei corrispondenti operatori new e delete. Significa che se si scrive new, ci deve essere la sua copia speculare di delete da qualche parte. Inoltre, il nuovo e l'eliminazione possono essere situati in parti diverse del programma, per esempio, in metodi diversi:
Se, dopo aver chiamato foo_analize, gli oggetti sono ancora necessari, l'operatore di cancellazione può essere messo da qualche altra parte, dove gli oggetti sono garantiti essere necessari. Un tale luogo universale può essere OnDeinit, per esempio, che viene chiamato prima della chiusura del programma.
Ricordate la cosa principale, Se c'è un operatore nuovo, ci deve sempre essere un operatore di cancellazione per esso. Altrimenti ci saranno perdite di memoria. Gli operatori new e delete che lavorano con lo stesso oggetto non devono essere "affiancati" nello stesso metodo. La cancellazione può essere ovunque lontano dall'allocazione di memoria, purché la cancellazione abbia un riferimento all'oggetto allocato nell'heap.
** Anche se questo è vero, è meglio evitare tali costrutti perché dobbiamo sempre stare molto attenti a dove e in quali circostanze viene chiamato l'operatore di cancellazione, che non è sempre ovvio. Invece, devi solo imparare a usare le classi. La classe permette di posizionare e cancellare automaticamente gli oggetti sull'heap, senza usare gli operatori new e delete:
Questa classe non contiene esplicitamente dei puntatori. Quindi non c'è bisogno di usare sia new che delete. Dopo l'uscita del programma, la classe libererà automaticamente tutti gli oggetti CItem e CArrayObj, il che rende la vita più facile allo sviluppatore.
Grazie. Ma non ho trovato una risposta alla mia domanda. Dove devo mettere la cancellazione se dichiaro un puntatore. Ripeto, l'oggetto CArrayObj è dichiarato in una funzione... come posso cancellarlo in Deinit()?
Ma prima ho risolto il problema in questo modo. Prima di finire la funzione:
Grazie. Non sono riuscito a trovare una risposta alla mia domanda esatta. Dove devo mettere la cancellazione se dichiaro un puntatore. Di nuovo, l'oggetto CArrayObj è dichiarato in una funzione... come posso cancellarlo in Deinit()?
Questo non è un club di telepati. Non hai allegato il tuo codice, quindi puoi decidere da solo dove mettere la cancellazione.
Non è corretto.