Características da linguagem mql5, subtilezas e técnicas - página 160

 
Alexey Viktorov:

NULL é uma tal ambiguidade que é preciso lidar com ela com cuidado.

void OnStart()
{
  uchar Bytes[];

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

Mais uma vez, uma cadeia de entrada não pode ser NULL (forçada por ""). As outras cordas podem.

 
fxsaber:

Mais uma vez, a cadeia de entrada não pode ser NULL (forçada por ""). As outras cordas podem.

a entrada é quase sinónimo de const, const deve ser rubricada
 
fxsaber:

Mais uma vez, a cadeia de entrada não pode ser NULL (forçada por ""). As outras cordas podem.

Mais uma vez, porque acha que não deveria haver uma tal conversão? Os meus conhecimentos e experiência não são suficientes para explicar tudo isto. Por isso, mantenha-se fiel à sua opinião. Espero que os programadores não o alterem.

 
Alexey Viktorov:

Mais uma vez, porque acha que não deveria haver tal conversão?

Eu sei exactamente porque é que esta conversão acontece. Estamos aqui a falar de uma característica, não de um insecto.

 
Maxim Kuznetsov:
a entrada é quase sinónimo de const, const deve ser inicializada

NULL é a inicialização. O exemplo mostra propositadamente uma cadeia não-inputada.

 
fxsaber:
É uma boa ideia gerar um aviso em tempo de compilação.

Sim, este comportamento é provavelmente apenas "infalível".
Aparentemente, porque uma variável de entrada deve ser inicializada,= NULL é artificialmente equacionada com =" " quando a variável já ocupa pelo menos um byte na memória.

Na MQL5 as entradas:

string str=NULL;
string str;

São absolutamente idênticos. Não é atribuída nenhuma memória para a variável. De qualquer modo, não encontrei quaisquer diferenças.
Em java, por exemplo, tais registos são ligeiramente diferentes, apesar do facto de não ser atribuída memória para a variável em ambos os casos, também. A primeira variante (String string = null;) será considerada inicializada, embora não seja atribuída memória para a variável e a variável possa ser impressa como vazia. No segundo caso (String string;) quando se tenta imprimir a variável, será gerado um erro de variável não-inicializada.
Isto é, a MQL5 é mais tolerante a este respeito.
O que é melhor, eu nem sequer sei.

 
Nikolai Semko:

Aparentemente, porque uma variável de entrada deve ser inicializada, o= NULL é artificialmente igualado a ="", quando a variável já ocupa pelo menos um byte na memória.

NULL não é uma inicialização, é um valor. Pode atribuir NULL a qualquer variável de cadeia não-constritiva no meio do código. E será igual ao NULL.

A entrada não é igual a NULL porque no arranque é criado um set-file invisível. A partir deste ficheiro, os valores das variáveis são "analisados" em entradas. A análise não pode sair NULL de qualquer maneira e por isso coloca lá um fio vazio.

Apenas o cordão de entrada tem este comportamento. Para const-string e outros, está bem, claro.
 
fxsaber:

NULL não é uma inicialização, mas sim um valor. É possível atribuir qualquer variável de cadeia não-constritiva ao NULL no meio do código. E será igual ao NULL.

A entrada não é igual a NULL porque no arranque é criado um set-file invisível. A partir deste ficheiro, os valores das variáveis são "analisados" em entradas. A análise não dará qualquer resultado NULL e, portanto, colocará aí um fio vazio.

Bem, é a isso que me refiro. Concordo.
A única coisa é que não vale a pena atribuir um valor NULL a uma cadeia na fase de declaração da variável:

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

Só faz sentido fazer isto para zerar a variável já inicializada na memória.

 
Nikolai Semko:

Bem, é isso que estou a dizer. Concordo.
A única coisa é que não vale a pena atribuir um valor NULL a uma cadeia na fase de declaração da variável:

só faz sentido fazer isto para anular uma variável na memória.

#define  DEFAULT_VALUE NULL

string Str = DEFAULT_VALUE;

if (Str == DEFAULT_VALUE)
  ...

Aqui a inicialização NULL faz sentido.

 
fxsaber:

A inicialização NULL faz aqui sentido.

sim