Caratteristiche del linguaggio mql5, sottigliezze e tecniche - pagina 160

 
Alexey Viktorov:

Il NULLA è una tale ambiguità che bisogna trattarla con attenzione.

void OnStart()
{
  uchar Bytes[];

  Print(StringToCharArray(NULL, Bytes)); // 0
  Print(StringToCharArray("", Bytes));   // 1
}

Ancora una volta, una stringa in ingresso non può essere NULL (forzata da ""). Le altre corde possono.

 
fxsaber:

Ancora una volta, la stringa in ingresso non può essere NULL (forzata da ""). Le altre corde possono.

input è quasi sinonimo di const, const deve essere inizializzato
 
fxsaber:

Ancora una volta, la stringa in ingresso non può essere NULL (forzata da ""). Le altre corde possono.

Di nuovo, perché pensa che non ci dovrebbe essere una tale conversione? Le mie conoscenze ed esperienze non sono sufficienti per spiegare tutto questo. Quindi si attenga alla sua opinione. Spero che gli sviluppatori non vadano avanti e lo cambino.

 
Alexey Viktorov:

Di nuovo, perché pensa che non ci debba essere questa conversione?

So esattamente perché avviene questa conversione. Stiamo parlando di una caratteristica qui, non di un bug.

 
Maxim Kuznetsov:
input è quasi sinonimo di const, const deve essere inizializzato

NULL è l'inizializzazione. L'esempio mostra volutamente una stringa non in ingresso.

 
fxsaber:
È una buona idea generare un avvertimento al momento della compilazione.

Sì, questo comportamento è probabilmente solo "infallibile".
Apparentemente, poiché una variabile di ingresso deve essere inizializzata,= NULL è artificialmente equiparato a ="" quando la variabile occupa già almeno un byte in memoria.

In MQL5 le voci:

string str=NULL;
string str;

Sono assolutamente identici. Nessuna memoria è allocata per la variabile. Comunque, non ho trovato alcuna differenza.
In java, per esempio, tali record sono leggermente diversi, nonostante il fatto che anche in entrambi i casi non venga allocata memoria per la variabile. La prima variante (String str = null;) sarà considerata inizializzata, anche se non viene allocata memoria per la variabile e la variabile può essere stampata come vuota. Nel secondo caso (String str;) quando si cerca di stampare la variabile, verrà generato un errore di variabile non inizializzata.
Cioè MQL5 è più tollerante in questo senso.
Quale sia meglio, non lo so nemmeno io.

 
Nikolai Semko:

Apparentemente, poiché una variabile di ingresso deve essere inizializzata, il= NULL è artificialmente equiparato a ="", quando la variabile occupa già almeno un byte in memoria.

NULL non è un'inizializzazione, è un valore. Si può assegnare NULL a qualsiasi variabile stringa non-const nel mezzo del codice. E sarà uguale a NULL.

Input non è uguale a NULL perché all'avvio viene creato un set-file invisibile. Da questo file i valori delle variabili vengono "analizzati" in input. Il parsing non può comunque emettere NULL e quindi ci mette una stringa vuota.

Solo input-string ha questo comportamento. Per const-string e altri, va bene, naturalmente.
 
fxsaber:

NULL non è un'inizializzazione, ma un valore. Potete assegnare qualsiasi variabile stringa non-const a NULL nel mezzo del codice. E sarà uguale a NULL.

Input non è uguale a NULL perché all'avvio viene creato un set-file invisibile. Da questo file i valori delle variabili vengono "analizzati" in input. Il parsing non darà in output NULL e quindi vi metterà una stringa vuota.

Beh, questo è quello che voglio dire. Sono d'accordo.
L'unica cosa è che non ha senso assegnare un valore NULL a una stringa al momento della dichiarazione della variabile:

string str1 = NULL;
string str2;
PRINT((str1==NULL));   // true
PRINT((str2==NULL));   // true

Ha senso farlo solo per azzerare la variabile già inizializzata in memoria.

 
Nikolai Semko:

Beh, è quello che sto dicendo. Sono d'accordo.
L'unica cosa è che non ha senso assegnare un valore NULL a una stringa al momento della dichiarazione della variabile:

ha senso farlo solo per annullare una variabile in memoria.

#define  DEFAULT_VALUE NULL

string Str = DEFAULT_VALUE;

if (Str == DEFAULT_VALUE)
  ...

Qui l'inizializzazione NULL ha senso.

 
fxsaber:

L'inizializzazione NULL ha senso qui.