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
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.
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.
È 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.
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.
Il primo ciclo di costruzione del kernel. In una delle funzioni:
int Ширина_канваса = G_CORE[G_CORE[Окно][Его_канвас]][_X_SIZE];
Если G_CORE[Окно][Его_канвас] = 234523452345; (мусор) то ошибка. А если бы G_CORE[Окно][Его_канвас] = 0; Ошибки нет, и ядро продолжает нормально строится.
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...".
Nikolai, non preoccuparti per MQL4, lì va tutto bene. Il topicstarter riempie gli array a suo piacimento. Tutto.
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
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?
Peter, non so cosa vuoi dire.
Esattamente, non capisci. Stai paragonando i miei compiti ai tuoi...
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.
Esattamente, non capisci. A confronto, i miei compiti e i vostri...
Vai avanti e crea un monologo - altri 10 post di fila.
È 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.
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:
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:
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.