Cancellazione forzata dell'array in MT5? - pagina 2

 
Artyom Trishkin:

Certo che sì.

Ogni programmatore che rispetta se stesso e i suoi programmi non lascerà che le cose facciano il loro corso. In MQL4, se non si usa #property strict, si può fare riferimento ad una matrice con dimensione 10 per indice 20. E non succederà nulla - il programma continuerà a funzionare, ma sta al programmatore decidere cosa usare dopo. Se è intelligente, certamente controllerà e controllerà tutto, in modo da non ottenere valori al di fuori dell'array, ma se lo fa "grossolanamente", non pensa a tale controllo, e "la cosa principale è che funzioni, ma come funziona - in qualche modo...".
La maggior parte degli utenti, che non si sono preoccupati di questo, si sono lamentati del "cattivo, malvagio e complicato MQL5", perché non permette loro di falsificare le proprie creazioni come prima. Ma coloro che all'inizio pensavano e creavano il codice con i controlli e il controllo dei dati ricevuti, non hanno notato alcuna differenza nella complessità dei linguaggi, e ora si chiedono - "dov'è la complessità - è lo stesso...".

Il codice ha mostrato che la divisione per zero senza #proprietà rigorosa è consentita e il pianeta non sta collassando in un buco nero, ma a volte uno vuole dividere per zero, ma non lo lasciano fare
 
Алексей Тарабанов:

Nikolai, non preoccuparti per MQL4, lì va tutto bene. Il topicstarter riempie gli array a suo piacimento. Tutto.

Artyom Trishkin:

Certo che sì.

Qualsiasi programmatore, che rispetta se stesso e i suoi programmi, non lascerà correre. In MQL4, se non si usa #property strict, si può fare riferimento ad una matrice con dimensione 10 per indice 20. E non succederà nulla - il programma continuerà a funzionare, ma sta al programmatore decidere cosa usare dopo. Se è intelligente, certamente controllerà e controllerà tutto, in modo da non ottenere valori al di fuori dell'array, ma se lo fa "di botto", non gli importa di questo controllo, e "l'importante è che funzioni, ma come funzionerà in qualche modo...".
La maggior parte degli utenti, che non si sono preoccupati di questo, si sono lamentati del "cattivo, malvagio e complicato MQL5", perché non permette loro di falsificare le proprie creazioni come prima. Ma coloro che originariamente pensavano e creavano il codice con la verifica e il controllo dei dati ricevuti, non hanno notato alcuna differenza nella complessità dei linguaggi, e ora si chiedono - "dov'è la complessità - è lo stesso...".

Che peccato!
Bene, Petr, grazie al rigore di MQL5, hai la possibilità di mettere il codice in ordine relativo e di eliminare il mucchio di spazzatura.
Puoi anche provare a compilare il codice fisso con #property strict di nuovo in MQL4 e forse funzionerà più velocemente su MT4

 
Nikolai Semko:

Che sfiga!
Bene, Peter, grazie alla severità di MQL5, abbiamo la possibilità di mettere il codice in ordine relativo e cancellare i mucchi di spazzatura.
Puoi anche provare a compilare il codice fisso in MQL4 con #property strict e forse funzionerà più velocemente in MT4

È così che, a priori, avete deciso che il mio codice è pieno di spazzatura.

Mi spiego: il kernel viene riempito a tappe, in diversi passi. Se quando si dichiara l'array in MT5 c'è della spazzatura in esso (cosa che non sapevo), allora durante i primi passi della costruzione del kernel nelle funzioni, c'è un overflow fuori dall'array, perché invece dei puntatori alle variabili, mi riferisco a una cella del kernel attraverso un'altra. Se contiene zero, va bene, e ottiene il valore giusto nella seconda esecuzione, ma se contiene spazzatura, si verifica un errore critico.

Vi è chiaro?

 
Nikolai Semko:
Peter, non so cosa vuoi dire.
...

Esattamente, non capisci. Stai paragonando i miei compiti ai tuoi...

 
...
Se si verifica un overflow, cercate errori in voi stessi.
E se c'è della spazzatura, è la vostra spazzatura che non avete pulito.

Non ho alcun overflow. Considera le specifiche della mia tecnologia (dimenticato che la stai ignorando). Se usi un'altra cella dell'array come puntatore a una cella, e c'è della spazzatura dentro, allora sei fuori dall'array. Il problema è che per far sì che la cella a cui ti riferisci ottenga il valore corretto, devi passare al secondo giro di costruzione del kernel. E al secondo giro, il valore sarà corretto. Ma non si arriva al secondo turno a causa di un errore critico.

Tutto questo è dovuto alla spazzatura nell'array dichiarato.

Quindi, dobbiamo inventare dei meccanismi per cancellare l'array bidimensionale (kernel) nella fase della prima impostazione delle dimensioni (costruzione dell'area regolare) e nella fase del secondo ridimensionamento del kernel, quando si costruisce l'area utente.

 
Реter Konow:

Esattamente, non capisci. A confronto, i miei compiti e i vostri...

Vai avanti e crea un monologo - altri 10 post di fila.

 
Реter Konow:

È così che, a priori, avete deciso che il mio codice è pieno di spazzatura.

Mi spiego: il kernel viene riempito a tappe, in diversi passi. Se quando si dichiara l'array in MT5 c'è della spazzatura in esso (cosa che non sapevo), allora durante i primi passi della costruzione del kernel nelle funzioni, c'è un overflow fuori dall'array, perché invece dei puntatori alle variabili, mi riferisco a una cella del kernel attraverso un'altra. Se contiene zero, va bene, e ottiene il valore giusto nella seconda esecuzione, ma se contiene spazzatura, si verifica un errore critico.

Vi è chiaro?

Non èaffatto così. Non è colpa della spazzatura, ma dell'assenza di #property strict in mql4. Senza di esso, si ottiene 0 invece di array overrun, e in mql5 è già un errore critico. Probabilmente, è meglio controllare la lunghezza dell'array invece del contenuto di un indice di array inesistente.

 
Alexey Viktorov:

Retag non è affatto così. Non è colpa della spazzatura, è la mancanza di #property strict in mql4. Senza questo espediente si ottiene 0 invece di array overrun, e in mql5 già errore critico. Probabilmente, è meglio controllare la lunghezza dell'array invece del contenuto di un indice di array inesistente.

Il fuori limite si verifica perché c'è della spazzatura nella cella indicatrice.

Per esempio:

G_CORE[Объект][Канвас] = G_CORE[Окно][Его_канвас];

Iniziale:

G_CORE[Oggetto][Kanvas] = -123423452345; (spazzatura)

G_CORE[Window][His_canvas]= -452345; (spazzatura)

//-----------------------------------------------------------------

Il risultato è fuori dalla matrice.

Per ribadire. Alcune celle hanno valori zero in MT4 e sono riempite al secondo giro nella prima fase di riempimento del nucleo.

In MT5, a causa della spazzatura nelle celle, c'è un errore critico al primo turno.

Se le celle dell'array avessero degli zeri, non ci sarebbe alcun errore e il kernel si riempirebbe in modo sequenziale (come dovrebbe).

 

Ecco un esempio più preciso:

Il primo ciclo di costruzione del kernel. In una delle funzioni:

int Ширина_канваса = G_CORE[G_CORE[Окно][Его_канвас]][_X_SIZE];

Если G_CORE[Окно][Его_канвас] = 234523452345; (мусор) то ошибка. А если бы G_CORE[Окно][Его_канвас] = 0; Ошибки нет, и ядро продолжает нормально строится.
 
Реter Konow:

Il fuori limite si verifica perché c'è della spazzatura nella cella indicatrice.

Per esempio:

Iniziale:

G_CORE[Oggetto][Kanvas] = -123423452345; (spazzatura)

G_CORE[Window][His_canvas]= -452345; (spazzatura)

//-----------------------------------------------------------------

Il risultato è fuori dalla matrice.

Per ribadire. Alcune celle hanno valori zero in MT4 e sono riempite al secondo turno nella prima fase di riempimento del nucleo.

In MT5, a causa della spazzatura nelle celle, c'è un errore critico al primo turno.

Se ci fossero degli zeri nelle celle dell'array, non ci sarebbe nessun errore e il kernel sarebbe riempito in modo sequenziale (come dovrebbe essere).

La non inizializzazione dell'array è interamente colpa del kodopistael. Cercate l'errore nel vostro ambiente. Ricostruisci il tuo algoritmo.