Errori, bug, domande - pagina 2045

 

Ma ho impostato la dimensione sbagliata dell'array lì, forse l'ha influenzato in qualche modo (anche se non dovrebbe influenzarlo affatto).

Prova questo con dimensione = 3

template<typename T>
int F1(const T& array[]) { return ArrayMaximum(array); }

template<typename T>
int F2(const T& array[]) { return F1(array); }

void OnStart()
  {
    int arr[3]= { 1, 2, 3 };
    Print(F2(arr));  // Выдаёт -1 !!!
  }
 

Scoperta la causa della discrepanza. Con OPTIMIZE=0 c'è un errore, ma non con OPTIMIZE=1. Di solito uso solo OPTIMIZE=0

 
fxsaber:

Se trovo una spiegazione logica (non contraddittoria) per il risultato, non vedo il bug. Non credo che sia accettabile provare un bug se il risultato non corrisponde al C++. È in C++ che qualcuno l'ha pensato e l'ha fatto. Ma forse non l'hanno pensato e quindi non l'hanno fatto. Ecco perché è meglio non fare riferimento a qualcosa là fuori, ma affidarsi al proprio concetto interiore di ciò che deve essere. Ed è auspicabile che questo "proprio" sia davvero il proprio. Non il risultato dell'impercettibile imposizione di stereotipi "come dovrebbe essere" man mano che si acquisisce esperienza di programmazione.

Se non avete la vostra spiegazione, significa che non c'è nessun errore. E se questa spiegazione appare un anno dopo ed è piuttosto convincente, tutti dovranno rifare tutto? In C++ hanno già pensato cento volte perché si fa così e non così. E la spiegazione è necessaria se qualcosa è impostato diversamente in MQL che in C++ e non viceversa.

 
Alexey Viktorov:
Una variabile statica può essere inizializzata con una costante o un'espressione costante corrispondente al suo tipo, a differenza di una semplice variabile locale, che può essere inizializzata con qualsiasi espressione.


Ma non una funzione.

Allora le istanze di classe statiche dovrebbero essere vietate - perché sono inizializzate da una funzione costruttrice

 

E qui c'è di più sull'argomento dell'inizializzazione delle variabili. Se seguite ciò che è stato detto nella documentazione, allora non potete neanche fare riferimento ad altre variabili globali/statiche. Poiché non è un'espressione costante:

int a= 1;
int b= a+1;  // Согласно документации, такая инициализация не возможна

void OnStart()
{
  Print(b);
}

Tuttavia, per ora funziona. E suppongo che molte persone abbiano sempre usato questi costrutti senza rendersene conto. Ma si scopre che gli sviluppatori possono disabilitarlo in qualsiasi momento. E, come nel caso dell'inizializzazione delle funzioni, questi codici saranno ancora compilati con successo, ma non funzioneranno correttamente. Tutto sommato, l'intero MQL è una bomba a orologeria.

 
Alexey Navoykov:

Ed ecco un'altra cosa sull'inizializzazione delle variabili. Se seguite ciò che è stato detto nella documentazione, allora non potete nemmeno fare riferimento ad altre variabili globali/statiche. Perché non è un'espressione costante:

//+------------------------------------------------------------------+
//|                                                   ExpertMACD.mq5 |
//|                   Copyright 2009-2017, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
CExpert ExtExpert;

è inizializzato da una funzione costruttore - vietato!

Questo se si riassumono logicamente gli ultimi post

Alexey Navoykov:

Ho scoperto la ragione della discrepanza. Con OPTIMIZE=0 c'è un errore, ma non con OPTIMIZE=1. Io uso sempre e solo OPTIMIZE=0.

Nel terminale a 32 bit si verifica un errore in qualsiasi OPTIMIZE

int g1( int& t[] ) { return ArraySize( t ); }
int g2( int& t[] ) { return g1( t ); }
void OnStart()
{
        int t[] = { 1, 2, 3, 4, 5 }; //всего 5
        Print( g2(t)); //Результат:          3
}
 
A100:

è inizializzato da una funzione costruttore - vietato!

Questo se si riassumono logicamente gli ultimi post

Beh, la persona si è espressa male lì. Naturalmente, stiamo parlando di un valore di inizializzazione, non di una funzione di inizializzazione.


E che diavolo - divieti. Non causano problemi da soli. Ma quando questo divieto non è controllato dal compilatore in alcun modo, ma genera un algoritmo che aggira le regole del linguaggio, non si adatta affatto. Ora dovrete scavare in tutto il codice alla ricerca di queste cose ed essere costantemente in guardia. Beh, fanculo questo tipo di programmazione, preferisco rimanere sulla vecchia build.

 
Alexey Navoykov:
Capisco, mi scuso allora, non me ne sono accorto subito. Sono sorpreso, ovviamente, di come siano riusciti a cambiarlo in silenzio e non l'abbiano detto a nessuno. Quello che non capisco è perché il compilatore non reagisce all'esecuzione di un'operazione non valida. Cioè, il bug è presente in ogni caso.
Perché pensa che non sia valido? Si prega di utilizzare a propria discrezione. Il problema è che quando una variabile statica viene inizializzata da una funzione, l'inizializzazione viene "messa in pausa" e la funzione viene eseguita. E nell'esempio precedente, c'è ancora una variabile statica in quella funzione che non è stata ancora inizializzata. Quindi, una variabile inizializzata da una funzione prende un valore diverso.
 
Alexey Navoykov:

E qui c'è di più sull'argomento dell'inizializzazione delle variabili. Se seguite ciò che è stato detto nella documentazione, allora non potete nemmeno fare riferimento ad altre variabili globali/statiche. Poiché non è un'espressione costante:

Tuttavia, per ora funziona. E suppongo che molte persone abbiano sempre usato questi costrutti senza rendersene conto. Ma si scopre che gli sviluppatori possono disabilitarlo in qualsiasi momento. E, come nel caso dell'inizializzazione delle funzioni, questi codici saranno ancora compilati con successo, ma non funzioneranno correttamente. Tutto sommato, l'intero MQL è una miniera che lavora al rallentatore.

Bene... non c'è alcuna discrepanza con la descrizione nella documentazione in questo esempio... Guardate bene la citazione della documentazione

Una variabile statica può essere inizializzata con una costante o un'espressione simile alla costante appropriata al suo tipo, a differenza di una semplice variabile locale che può essere inizializzata con qualsiasi espressione.


o da un' espressionecostante

int a= 1;
int b= a+1;

Questa inizializzazione è possibile. Perché la variabile 'a' è inizializzata da una costante e la variabile 'b' è inizializzata da un'espressione costante.

 
A100:

Allora dovete proibire le istanze statiche delle classi - perché sono inizializzate dalla funzione costruttore

Prestare attenzione a

Forum sul trading, sistemi di trading automatico e test di strategie di trading

Bug, bug, domande

Alexey Viktorov, 2017.10.18 09:19

Perché pensa di essere cambiato, perché è inaccettabile? Si prega di utilizzare a propria discrezione. Il problema è che quando una variabile statica viene inizializzata da una funzione, l'inizializzazione viene "messa in pausa" e quella funzione viene eseguita. E nell'esempio precedente, c'è ancora una variabile statica in quella funzione che non è stata ancora inizializzata. Quindi, una variabile inizializzata da una funzione prende un valore diverso.
Purtroppo non so se è possibile dichiarare e inizializzare le variabili statiche nel costruttore, ma spero che me lo dirai. E, da quanto ho capito, la sequenza di inizializzazione è molto importante.