Errori, bug, domande - pagina 2046

 
Alexey Viktorov:

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

Qui 'b' è inizializzato NON da un'espressione costante. Ecco perché contraddice le regole descritte nella documentazione.

Ilproblema è che quando unavariabile statica viene inizializzata da una funzione, l'inizializzazione viene "messa in pausa" e la funzione viene eseguita. Nell'esempio precedente, c'è una variabile statica in quella funzione che non è stata ancora inizializzata. Quindi, una variabile inizializzata da una funzione prende un valore diverso.

Ma come si può mettere in pausa l'inizializzazione? Tutte le operazioni sono eseguite in un ordine rigoroso definito dalla sintassi del linguaggio. Prima viene eseguita la funzione, e poi il valore restituito da questa funzione viene passato al costruttore della nostra variabile - questo si chiama inizializzazione. Ma l'operazione di inizializzazione è palesemente ignorata dal compilatore in questo caso, e il codice continua a compilare come se nulla fosse accaduto. Questo è inaccettabile. È come se, per esempio, dichiaraste il seguente array int a[]= { f(), g(), h() }; e compilerebbe, ma naturalmente senza inizializzare nulla.

 
A100:

Nel terminale a 32 bit un errore su qualsiasi OPTIMIZE

Reale. Controllato in MT4, ci sono effettivamente errori in qualsiasi modo. E come la gente codifica qualcosa lì sulle nuove costruzioni
 
Alexey Navoykov:

'b' qui è inizializzato da NON un'espressione costante. Quindi è contro le regole descritte nella documentazione.

Come si può mettere in pausa l'inizializzazione? Tutte le operazioni sono eseguite in un ordine rigoroso definito dalla sintassi del linguaggio. Prima viene eseguita la funzione, e poi il valore restituito da questa funzione viene passato al costruttore della nostra variabile - questo si chiama inizializzazione. Ma l'operazione di inizializzazione è palesemente ignorata dal compilatore in questo caso, e il codice continua a compilare come se nulla fosse accaduto. Questo è inaccettabile. È come se, per esempio, dichiaraste il seguente arrayint a[]= { f(), g(), h() }; e compilerebbe, ma naturalmente senza inizializzare nulla.

Se non da un'espressione costante, allora da COSA?

Alexey, è più facile se prendi quel codice da solo e guardi la sequenza di inizializzazione nel debugger. Inoltre, non ho notato subito che in questo esempio

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

Bug, bug, domande

Alexey Navoykov, 2017.10.17 20:31

E qui c'è di più sull'argomento dell'inizializzazione delle variabili. Se seguite ciò che è stato menzionato nella documentazione, allora non potete fare riferimento anche 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. Quindi, l'intero codice MQL è una bomba a orologeria.


Sono le variabili di livello globale, non quelle statiche situate all'interno di qualsiasi funzione.

Non ho abbastanza conoscenze per spiegarlo, e voi non siete abbastanza attenti. "sospeso" tra virgolette!!!

Non confondete l'inizializzazione delle variabili statiche e ordinarie, tanto più per le variabili locali.

 
Alexey Viktorov:

Se non da un'espressione costante, allora da cosa?

Un'espressione non costante.

Inoltre, non ho notato immediatamente Il punto principale è che questo esempio parla di variabili di livello globale e non di quelle statiche situate all'interno di qualsiasi funzione.

Non ho abbastanza conoscenze per spiegarlo in modo chiaro, e tu non hai la capacità di attenzione...

Non stai confondendo qualcosa?

Inoltre, le variabili globali e statiche si comportano in modo assolutamente identico. Ecco la documentazione:

Una variabile globale può essere inizializzata solo da una costante o da un'espressione costante corrispondente al suo tipo.

Devo confessare che è stata una rivelazione tanto per me quanto per le variabili statiche. Non so quando tutto ciò è apparso nella documentazione o forse è stato prima, ma nessuno ci ha fatto caso, perché tutto funzionava effettivamente come in C++, quindi non sorgevano domande.

 
Alexey Navoykov:

Un'espressione non costante.

Non stai confondendo le cose?

Inoltre, le variabili globali e statiche si comportano esattamente allo stesso modo. Ecco qualcosa dalla documentazione:

Devo confessare che questa è stata una rivelazione per me tanto quanto lo è stata per le variabili statiche. Non so quando tutto ciò è apparso nella documentazione e forse è stato prima, ma nessuno ci ha fatto caso perché tutto funzionava effettivamente in C++ e quindi non sorgevano domande.

Penso che lei abbia assolutamente torto. Come si può parlare dell'identità delle variabili, se alcune sono disponibili in tutte le funzioni definite nel programma e altre solo nella funzione in cui sono dichiarate.

E la differenza tra variabili statiche e locali è che le variabili statiche sono inizializzate immediatamente dopo le globali, e le ordinarie locali (non statiche) durante l'esecuzione del programma, quando il codice arriva a loro.

 
Alexey Viktorov:

Mi sembra che lei si sbagli completamente. Come si può parlare di variabili identiche se alcune sono accessibili da tutte le funzioni definite nel programma, e altre solo nella funzione in cui sono dichiarate.

Stavi parlando del contesto specifico della discussione(inizializzazione delle variabili), non in generale.

 
Dopo aver inviato messaggi tramite chat completa, il messaggio inviato non viene aggiunto automaticamente alla cronologia della chat della pagina corrente.
Il messaggio inviato appare solo dopo aver ricaricato la pagina.

Solo una rapida occhiata, la risposta del server quando si invia il messaggio è adeguata, forse qualcosa è andato storto nei gestori di eventi nel codice js.
 
Alexey Navoykov:

Si trattava del contesto specifico della discussione(inizializzazione delle variabili), non in generale.

Per quanto ricordo, si trattava di inizializzare una variabile STATIC

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

Bug, bug, domande

Alexey Navoykov, 2017.10.17 17:16

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

class A
{
 public:
  static int f()
  { 
    static int a=1;
    Print(a);       // Получаем a=0 !!
    return a;  
  }   
};


int a= A::f();


void OnStart()
  {
   
  }

Chi non se la prende, lo mandi al service-desk. Non ho più alcun desiderio di comunicare con loro lì.


O non è questo il suo messaggio?

Risolvi già la sequenza di inizializzazione delle variabili. In questo esempio viene inizializzata prima una variabile globale

int a= A::f();

che chiama una funzione che non ha ancora inizializzato una variabile con lo stesso nome.

static int a=1;

E di cosa possiamo parlare se non si presta attenzione agli avvertimenti del compilatore...


 
Alexey Navoykov:

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

Grazie per il messaggio.
Infatti, è un errore dell'ottimizzatore del compilatore.
La correzione sarà inclusa nella prossima build.
 
Alexey Viktorov:

Per quanto ricordo, si trattava di inizializzare una variabile STATIC

O non è questo il suo messaggio?

Non capisco cosa vuoi. Ho detto che si trattava di "inizializzazione di variabili". E in questo contesto le variabili statiche e globali si comportano in modo identico. Ti ho anche dato un link alla documentazione:inizializzazione delle variabili

Notate che le variabili statiche e globali sono ovunque insieme.

E non critichiamo la sequenza di inizializzazione perché non è legata al problema in questione. Lasciate che vi ricordi che il problema è che il compilatore NON genera un errore dove dovrebbe. Se una variabile statica non è ancora inizializzata, non è possibile accedervi.

E di cosa possiamo parlare se si ignorano gli avvertimenti del compilatore...

Beh, cambiate il nome della variabile globale, se vi dà così fastidio. Non influenzerà il risultato.

Motivazione: