Caratteristiche del linguaggio mql5, sottigliezze e tecniche - pagina 161

 
printf("%s , %f , %i",(string)NULL,(double)NULL,(int)NULL);

2020.01.27 01:15:57.859 tst (EURUSD,H1) (null) , 0.000000 , 0

se rimuovo la conversione di tipo, il 'NULL' - espressione di tipo 'void' è illegale

interessante, si scopre che la stringa nput può essere inizializzata void

 
fxsaber:

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

NULL / NIL (in altri termini) non può essere un'inizializzazione di un'entità stringa costante.

Almeno perché la stringa mql non è un "puntatore" come in C. Non ha uno stato speciale "niente di niente".

PS (oh, non me lo aspettavo da me stesso)

 
Maxim Kuznetsov:

Non ha uno stato speciale di "niente di niente"

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

Peculiarità di mql5, consigli e trucchi

fxsaber, 2020.01.26 15:54

void OnStart()
{
  uchar Bytes[];

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

Uso questa condizione ogni giorno.

 
Maxim Kuznetsov:

almeno perché una stringa mql non è un "puntatore" come in C. Non ha uno stato speciale "niente di niente".

PS (oh, non me lo aspettavo da me).

ahimè no, una stringa in MQL è un'entità con memoria allocata.@Ilyas ha spiegato perché StringBufferLen() può non mostrare la lunghezza della stringa, ma mostra la memoria utilizzata per memorizzare la stringa.


fxsaber:

Uso questa condizione ogni giorno.

Non è affatto un indicatore, in MQL4 disattivo i puntatori a qualsiasi oggetto usando StringConcatenate(), cioè il lavoro delle funzioni integrate non è implementato dalle regole MQL )))

input string s = NULL;
void OnStart()
{
   uchar Bytes[];
  Print(StringToCharArray(NULL, Bytes));  // 0
  Print(StringToCharArray("", Bytes));    // 1
  Print(StringToCharArray(s, Bytes));     // 1
}
 
Igor Makanu:

In MQL4, disattivo i puntatori a qualsiasi oggetto usando StringConcatenate(), cioè le funzioni integrate non sono implementate dalle regole MQL )))

Non fa alcuna differenza cosa c'è dentro.

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

Peculiarità di mql5, consigli e trucchi

Igor Makanu, 2020.01.26 22:27

input string s = NULL;
void OnStart()
{
   uchar Bytes[];

  Print(StringToCharArray(s, Bytes));     // 1
}
Perché non è NULLA. Il messaggio originale parlava proprio di questo.
 
fxsaber:

Non fa differenza come è dentro.

ha integrato il mio post con il tuo esempio


Ho anche fatto un altro paio di esperimenti con la stringa di input s = NULL;

per quanto ho capito, mentre non stiamo cercando di utilizzare il valore della variabile di ingresso - sarà NULL, ma nel momento in cui cerchiamo di assegnare il valore a un'altra variabile o semplicemente di disinserirla, NULL scomparirà, cioè la memoria sarà allocata a questa variabile di ingresso

 
Igor Makanu:

per quanto ho capito, mentre non stiamo cercando di utilizzare il valore di una variabile di input - questo valore è NULL, ma in quel momento, se cerchiamo di assegnare il valore di questa variabile di input a un'altra variabile o semplicemente di deselezionare questa variabile di input, allora questo NULL scomparirà, cioè la memoria sarà allocata a questa variabile di input

Il meccanismo di funzionamento della variabile di ingresso è stato descritto in dettaglio sopra.

 
fxsaber:

Non fa alcuna differenza cosa c'è dentro.

Perché non è NULLA. Il messaggio originale parlava proprio di questo.

c'è (ancora) specificità di dereferenziazione delle entità (non ci sono puntatori in mql, non è C, che ci siano entità)

input è una const dichiarata all'avvio. non potete dargli fisicamente il valore "NULL".

const string nothing=NULL; /// <--- ЭТО ЧТО ?

 
Nikolai Semko:

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

In MQL5 le voci:

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.

Come si fa a non assegnare memoria a una variabile?
La memoria è allocata e la variabile contiene spazzatura arbitraria.
E il fatto che la stringa non emetta alcun valore, è logico che il buffer sia vuoto.

char   ch; 
short  sh;
int    in;
double db;       
string st;

Print(sizeof(ch));
Print(sizeof(sh));
Print(sizeof(in));
Print(sizeof(db));
Print(sizeof(st));
Print("---------------------");
Print(ch);
Print(sh);
Print(in);
Print(db);
Print(st);
 
Roman:

Come si fa a non assegnare memoria a una variabile?
La memoria è allocata, ma la variabile non contiene spazzatura arbitraria.
E il fatto che la stringa non emetta alcun valore, è logico che il buffer sia vuoto.

char ch; 
short sh;       
string st;

Print(sizeof(ch));
Print(sizeof(sh));
Print(sizeof(st));

   string str1;
   string str2="Однажды, в студёную зимнюю пору я из лесу вышел; был сильный мороз.";
   Print(sizeof(str1));  // 12
   Print(sizeof(str2));  // 12
   uchar ch1[],ch2[];
   Print(StringToCharArray(str1, ch1));  // 0
   Print(StringToCharArray(str2, ch2));  // 68
Motivazione: