Errori, bug, domande - pagina 2044

 
Alexey Navoykov:

Bug con l'inizializzazione delle variabili statiche. Non era presente nelle vecchie build.

A chi non dispiace mandare questo al service-desk. Non ho più alcun desiderio di comunicare con loro lì.

Non è un bug, è stato discusso da qui. Estratto da

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

Peculiarità del linguaggio mql4, consigli e trucchi

Alexey Viktorov, 2017.04.30 08:54

La sequenza di inizializzazione: (per quelli che non lo sanno)

Prima, le variabili di livello globale poi quellestatiche disposte secondo la priorità delle funzioni, OnInit(), OnTick() o OnCalculate()... Non mi interessava oltre, e non mi interessavano quelli locali ai miei tempi. Così si scopre in questo codice che la funzione viene chiamata prima che le variabili statiche siano inizializzate, da qui l'errore di cui stiamo parlando. La funzione è chiamata prima che la variabile sia inizializzata

 
fxsaber:

Non è un bug, è stato discusso da qui. Estratto da

Quindi se è stato discusso tra te e Alexey Viktorov, questo ti dà ragione di credere che non sia un bug? ) E questa persona stessa afferma che il suo livello di conoscenza della programmazione è molto più basso del vostro. Cioè, può essere cancellato dalla lista. Sei l'unico rimasto). Ne avete discusso con voi stessi, quindi non è un bug).

È un bug. Non può essere così in linea di principio che l'inizializzazione di una variabile sarà ignorata e il codice continuerà ad essere eseguito saltando su di essa. Questa è una sciocchezza. E l'ordine di inizializzazione non ha importanza qui. La variabile è inizializzata o il compilatore genera un errore qui. Non c'è una terza via. Altrimenti non è un linguaggio di programmazione, ma qualcos'altro.

 

Un altro bug nelle nuove build:

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[4]= { 1, 2, 3 };
    Print(F2(arr));  // Выдаёт -1 !!!
  }


Eh, è così rozzo da queste parti. Ho pensato di aggiornare alle nuove build, perché quelle vecchie non accettano i prodotti nel Market. Ed ecco un bug su un bug!

 
Alexey Navoykov:

Quindi se questo è stato discusso tra te e Alexey Viktorov, questo ti dà ragione di credere che non sia un bug? ) E questa persona stessa afferma che il suo livello di conoscenza della programmazione è molto più basso del vostro. Cioè, può essere cancellato dalla lista. Sei l'unico rimasto). Ne avete discusso con voi stessi, quindi non è un bug).

È un bug. Non può essere così in linea di principio che l'inizializzazione di una variabile sarà ignorata e il codice continuerà ad essere eseguito saltando su di essa. Questa è una sciocchezza. E l'ordine di inizializzazione non ha importanza qui. La variabile è inizializzata o il compilatore genera un errore qui. Non c'è una terza via. Altrimenti non è un linguaggio di programmazione, ma qualcos'altro.

Puoi cancellarlo, non ho mai steso le dita "che tipo di programmatore sono"...

E tua madre non ti dice di leggere la documentazione? Ho inserito una citazione dalla documentazione specialmente per queste persone.

C'è un forum per il trading, i sistemi di trading automatico e il test delle strategie di trading

Peculiarità di mql4, consigli e trucchi

Alexey Viktorov, 2017.04.29 12:50

Va bene che l'aiuto dice che la variabile statica... leggi per te stesso

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.

Ecco come funziona

#property strict
#property indicator_chart_window

int TestBrokenStatic()
{
   static int stInt = 101;
   stInt++;
   return stInt;
}

int OnInit()
{
   static int result = 0;
   result = TestBrokenStatic();
   Print("TestStatic Expected result 102   - Actual result=", result);
   result = TestBrokenStatic();
   Print("TestStatic Expected result 103   - Actual result=", result);
   
   return INIT_SUCCEEDED;
}

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
   return rates_total;
}
2017.04.29 13:49:51.546 !Test USDCHF,M15: TestStatic Expected result 103   - Actual result=103
2017.04.29 13:49:48.457 !Test USDCHF,M15: TestStatic Expected result 102   - Actual result=102
2017.04.29 13:49:40.089 Custom indicator Test\!Test USDCHF,M15: loaded successfully

 
Alexey Navoykov:

Un altro bug nelle nuove build:

Eh, è così rozzo da queste parti. Ho pensato di aggiornare alle nuove build, perché quelle vecchie non accettano i prodotti nel Market. E poi c'è un bug su un bug!

E ho capito bene!

 
Alexey Viktorov:

Puoi cancellarlo, non ho mai steso le dita "che tipo di programmatore sono"...

E tua madre non ti dice di leggere la documentazione? Specialmente per queste persone, ho inserito una citazione dalla documentazione

Capisco, allora mi scuso, non l'ho notato subito. È incredibile, naturalmente, come siano riusciti a cambiarlo senza che nessuno se ne accorgesse. Quello che non capisco è perché il compilatore non reagisce all'esecuzione di un'operazione non valida. Cioè c'è un bug in ogni caso
 
fxsaber:

Ho capito bene!


Hmmm, qual è la tua costruzione? Il mio è il 1653.

 
Alexey Navoykov:

Quindi se questo è stato discusso tra te e Alexey Viktorov, questo ti dà ragione di credere che non sia un bug? ) E questa persona stessa afferma che il suo livello di conoscenza della programmazione è molto più basso del vostro. Cioè, può essere cancellato dalla lista. Sei l'unico rimasto). Ne avete discusso con voi stessi, quindi non è un bug).

È un bug. Non può essere così in linea di principio che l'inizializzazione di una variabile sarà ignorata e il codice continuerà ad essere eseguito saltando su di essa. Questa è una sciocchezza. E l'ordine di inizializzazione non ha importanza qui. La variabile è inizializzata o il compilatore genera un errore qui. Non c'è una terza via. Altrimenti non è un linguaggio di programmazione ma qualcos'altro.

Se trovo una spiegazione logica (coerente) del risultato, non vedo un bug. Non credo che sia accettabile provare un bug se il risultato non coincide con il C++. È qualcuno in C++ che ha pensato e fatto così. 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. E non il risultato dell'impercettibile imposizione di stereotipi "come dovrebbe essere" man mano che si acquisisce esperienza di programmazione.

Non mi dispiace avere torto. Sto lentamente imparando sul mio rastrello.

 
Alexey Navoykov:

Hmm, qual è la tua corporatura? Ho 1653.

1653x64.

 
fxsaber:

1653x64.

Strano come ci sia una discrepanza allora...


Chiedi a qualcun altro di controllare con se stesso.