Características del lenguaje mql5, sutilezas y técnicas - página 160

 
Alexey Viktorov:

NULL es una ambigüedad tal que hay que tratarla con cuidado.

void OnStart()
{
  uchar Bytes[];

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

Una vez más, una cadena de entrada no puede ser NULL (forzado por ""). Las otras cuerdas pueden.

 
fxsaber:

Una vez más, la cadena de entrada no puede ser NULL (forzado por ""). Las otras cuerdas pueden.

input es casi sinónimo de const, const debe ser inicializado
 
fxsaber:

Una vez más, la cadena de entrada no puede ser NULL (forzado por ""). Las otras cuerdas pueden.

De nuevo, ¿por qué crees que no debería haber tal conversión? Mis conocimientos y experiencia no son suficientes para explicar todo esto. Así que mantén tu opinión. Espero que los desarrolladores no sigan adelante y lo cambien.

 
Alexey Viktorov:

De nuevo, ¿por qué cree que no debería haber tal conversión?

Sé exactamente por qué ocurre esta conversión. Estamos hablando de una característica, no de un error.

 
Maxim Kuznetsov:
input es casi sinónimo de const, const debe ser inicializado

NULL es la inicialización. El ejemplo muestra a propósito una cadena sin entrada.

 
fxsaber:
Es una buena idea generar una advertencia en tiempo de compilación.

Sí, este comportamiento es probablemente "a prueba de tontos".
Aparentemente, debido a que una variable de entrada debe ser inicializada,= NULL se equipara artificialmente con ="" cuando la variable ya ocupa al menos un byte en la memoria.

En MQL5 las entradas:

string str=NULL;
string str;

Son absolutamente idénticos. No se asigna memoria para la variable. De todos modos, no he encontrado ninguna diferencia.
En java, por ejemplo, estos registros son ligeramente diferentes, a pesar de que tampoco se asigna memoria para la variable en ambos casos. La primera variante (String str = null;) se considerará inicializada, aunque no se asigna memoria para la variable y ésta puede imprimirse como vacía. En el segundo caso (String str;) al intentar imprimir la variable, se generará un error de variable no inicializada.
Es decir, MQL5 es más tolerante en este sentido.
Cuál es mejor, ni siquiera lo sé.

 
Nikolai Semko:

Aparentemente, debido a que una variable de entrada debe ser inicializada, el= NULL se equipara artificialmente a ="", cuando la variable ya ocupa al menos un byte en la memoria.

NULL no es una inicialización, es un valor. Puede asignar NULL a cualquier variable de cadena no-const en medio del código. Y será igual a NULL.

La entrada no es igual a NULL porque al inicio se crea un archivo de configuración invisible. A partir de este archivo se "analizan" los valores de las variables en las entradas. El análisis no puede dar como resultado NULL de todos modos y por lo tanto coloca una cadena vacía allí.

Sólo la cadena de entrada tiene este comportamiento. Para const-string y otros, está bien, por supuesto.
 
fxsaber:

NULL no es una inicialización, sino un valor. Puedes asignar cualquier variable de cadena no-const a NULL en medio del código. Y será igual a NULL.

La entrada no es igual a NULL porque al inicio se crea un archivo de configuración invisible. A partir de este archivo se "analizan" los valores de las variables en las entradas. El análisis sintáctico no dará como resultado NULL en absoluto y, por lo tanto, colocará una cadena vacía allí.

Bueno, eso es lo que quiero decir. Estoy de acuerdo.
Lo único es que no tiene sentido asignar un valor NULL a una cadena en la fase de declaración de la variable:

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

Sólo tiene sentido hacer esto para poner a cero la variable ya inicializada en memoria.

 
Nikolai Semko:

Bueno, eso es lo que estoy diciendo. Estoy de acuerdo.
Lo único es que no tiene sentido asignar un valor NULL a una cadena en la fase de declaración de la variable:

sólo tiene sentido hacer esto para anular una variable en memoria.

#define  DEFAULT_VALUE NULL

string Str = DEFAULT_VALUE;

if (Str == DEFAULT_VALUE)
  ...

Aquí tiene sentido la inicialización NULL.

 
fxsaber:

La inicialización NULL tiene sentido en este caso.