Errori, bug, domande - pagina 651

 
mql5:
No, non è solo un problema del terminale a 32 bit. Ma la soluzione per il terminale a 32 bit è pronta per oggi, mentre nel terminale a 64 bit c'è ancora una limitazione dello stack in 256Kb.
Ma se il programmatore non specifica la dimensione dello stack necessaria manualmente usando una proprietà, l'EX5 nel terminale lavorerà con la dimensione dello stack di default (256Kb).

Riguardo alle grandi dimensioni.
Ogni dichiarazione di variabile all'interno di una funzione (ad eccezione delle variabili statiche) alloca spazio sullo stack, e l'allocazione di spazio sullo stack per le variabili locali avviene ad ogni chiamata.

Quindi, se una funzione ha 64Kb di variabili locali, lo spazio dello stack è sufficiente per 3 chiamate, e l'overflow dello stack si verifica a 4 chiamate (poiché parte dello stack viene utilizzato per le esigenze interne del terminale). Quindi, se c'è bisogno di grandi dati locali, è meglio usare la memoria dinamica - quando si entra nella funzione, la memoria per le necessità locali viene allocata nel sistema (new, ArrayResize) e quando si esce dalla funzione, la memoria viene cancellata (delete, ArrayFree).

Grazie per la spiegazione dettagliata. Ma questo non è certo un mio problema. Proverò a scrivere un Expert Advisor di prova per rilevare questo errore, dato che la funzione in cui le gambe crescono è già trovata e non ci sono volumi di questo tipo (64Kb - 256Kb). Invierò un esperto al Service Desk con la funzione del problema di notte allora.

 

Un'altra domanda (e una richiesta di spiegarlo nell'aiuto) sul lavoro della stessa funzione(CLBufferWrite()).

Se scrivo informazioni direttamente dal buffer dell'indicatore con il flag ArrayIsSeries impostato (==true), in che direzione verrà letto l'array di input?

Ho il sospetto che la bandiera sarà ignorata, e inoltre non è chiaro da quale luogo sarà letta? Il turno sarà contato dalla fine fisica dell'array o dall'inizio?

Naturalmente, soffierò sull'acqua per sicurezza (lavorerò con ArrayIsSeries== false), ma ancora ?

 
La funzionalità di lavorare con il buffer OpenCL è attualmente incompleta e sarà aggiunta/descritta.
offset - queste funzioni sono realmente degli offset in byte dall'inizio del buffer OpenCL e l'array passato nella funzione sarà copiato dall'elemento zero senza tener conto del flag ArrayIsSeries.
 
mql5:
1) Attualmente, la funzionalità di lavorare con il buffer OpenCL non è completa e sarà aggiunta/aggiornata.
2. offset - queste funzioni sono in realtà un offset in byte dall'inizio del buffer OpenCL mentre un array passato nella funzione sarà copiato dall'elemento zero senza tener conto del flag ArrayIsSeries.

1. Lo sospettavo... :)

Quindi, non c'è modo di scrivere direttamente dal buffer dell'indicatore in parti (per ora).

Una buona idea è, naturalmente, quella di rendere le posizioni di partenza mobili sia nella fonte che nel ricevitore. Come qui:

int  ArrayCopy(
   void  dst_array[],       // куда копируем
   void  src_array[],       // откуда копируем
   int   dst_start=0,       // с какого индекса пишем в приемник
   int   src_start=0,       // с какого индекса копируем из источника
   int   cnt=WHOLE_ARRAY    // сколько элементов
   );

Con l'indicizzazione (direzione e unità (byte/elementi)) siate più attenti nell'aiuto. :)))

--

Grazie per la risposta, apprezzo molto i vostri sforzi per migliorare la funzionalità.

Non vedo l'ora di aspettare pazientemente che il banchetto continui. Nel frattempo, dovrò danzare sul bordo di un pugnale. :)

 

Build 597 x64, appena installato.

2012.02.23 21:43:24 OpenCLTest (EURUSD,M30) SaveBitmapToFile error opening 'Mandelbrot.bmp'
2012.02.23 21:43:13 OpenCLTest (EURUSD,M30) SaveBitmapToFile error opening 'Mandelbrot.bmp'
2012.02.23 21:43:12 OpenCLTest (EURUSD,M30) SaveBitmapToFile error opening 'Mandelbrot.bmp'
2012.02.23 21:43:10 OpenCLTest (EURUSD,M30) SaveBitmapToFile error opening 'Mandelbrot.bmp'
2012.02.23 21:43:09 OpenCLTest (EURUSD,M30) SaveBitmapToFile error opening 'Mandelbrot.bmp'
2012.02.23 21:43:08 OpenCLTest (EURUSD,M30) SaveBitmapToFile error opening 'Mandelbrot.bmp'
2012.02.23 21:43:07 OpenCLTest (EURUSD,M30) SaveBitmapToFile error opening 'Mandelbrot.bmp'
2012.02.23 21:43:06 OpenCLTest (EURUSD,M30) SaveBitmapToFile error opening 'Mandelbrot.bmp'

Questo non è mai successo prima.

// Win7 x64

 
MetaDriver:

Build 597 x64, appena installato.

Non era così prima.

// Win7 x64.

Prova a ricompilare l'esempio. L'ho controllato - funziona per me.
 
Renat:
Prova a ricompilare l'esempio. L'ho controllato - funziona per me.

L'ho già ricompilato un centinaio di volte, ora riavvio di nuovo.

 
MetaDriver:

... Riavvio di nuovo.

No, non ha aiutato.

Renat:

...... Ho controllato - per me funziona.

Funziona anche per me, ma ogni dieci o quaranta cicli ottengo lo stesso schifo:

2012.02.23 23 16:44 OpenCLTest (EURUSD,M30) SaveBitmapToFile errore nell'aprire 'Mandelbrot.bmp'.
2012.02.23 23 16:16:43 OpenCLTest (EURUSD,M30) SaveBitmapToFile error opening 'Mandelbrot.bmp'
2012.02.23 23 16:16:42 OpenCLTest (EURUSD,M30) SaveBitmapToFile error opening 'Mandelbrot.bmp'
2012.02.23 23 16:16:36 OpenCLTest (EURUSD,M30) SaveBitmapToFile error opening 'Mandelbrot.bmp'
 
MetaDriver:

No, non ha aiutato.

Questo funziona anche per me, ma ogni dieci o quaranta cicli ottengo questo schifo:

Anche scoperto.

Questo perché il file specificato viene gestito in due thread diversi senza sincronizzazione e occasionalmente il file viene bloccato:

  1. il thread dello script sovrascrive il file 10 volte al secondo (dipende dalla velocità della scheda)
  2. Chart ricarica l'immagine nel proprio thread su richiesta dello script

Poiché l'esempio con l'immagine è stato fatto solo per dimostrare il principio del lavoro con OpenCL, non è un problema.

Документация по MQL5: Файловые операции / FileMove
Документация по MQL5: Файловые операции / FileMove
  • www.mql5.com
Файловые операции / FileMove - Документация по MQL5
 
Renat:

Poiché l'esempio con l'immagine è stato fatto solo per dimostrare il principio del lavoro con OpenCL, non è un problema.

Sono d'accordo. Inoltre, è comunque il momento di fare un trasferimento direttamente nel buffer dell'oggetto GraphLabel. :)