Características del lenguaje mql5, sutilezas y técnicas - página 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

si elimino la conversión de tipos, la expresión 'NULL' - de tipo 'void' es ilegal

interesante, resulta que la cadena nput puede ser inicializada void

 
fxsaber:

NULL es la inicialización. El ejemplo muestra a propósito una cadena no introducida.

NULL / NIL (en otros términos) no puede ser una inicialización de una entidad de cadena constante.

Al menos porque la cadena mql no es un "puntero" como en C. No tiene un estado especial "nada en absoluto".

PS (oh, no me lo esperaba de mí mismo)

 
Maxim Kuznetsov:

No tiene un estado especial de "nada en absoluto"

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

Peculiaridades de mql5, consejos y trucos

fxsaber, 2020.01.26 15:54

void OnStart()
{
  uchar Bytes[];

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

Utilizo esta condición todos los días.

 
Maxim Kuznetsov:

al menos porque una cadena mql no es un "puntero" como en C. No tiene un estado especial "nada en absoluto".

PS (oh, no me lo esperaba de mí mismo).

Por desgracia no, una cadena en MQL es una entidad con memoria asignada.@Ilyas explicó por qué StringBufferLen() puede no mostrar la longitud de la cadena, pero muestra la memoria utilizada para almacenar la cadena.


fxsaber:

Utilizo esta condición todos los días.

No es un indicador en absoluto, en MQL4 yo desanimo los punteros a cualquier objeto usando StringConcatenate(), es decir, el trabajo de las funciones incorporadas no está implementado por las reglas de 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:

En MQL4, desanudo los punteros a cualquier objeto usando StringConcatenate(), es decir, las funciones incorporadas no están implementadas por las reglas de MQL )))

No hace ninguna diferencia lo que hay dentro.

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategias

Peculiaridades de mql5, consejos y trucos

Igor Makanu, 2020.01.26 22:27

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

  Print(StringToCharArray(s, Bytes));     // 1
}
Porque no es NULL. De eso trataba el mensaje original.
 
fxsaber:

Da igual cómo sea por dentro.

complementado mi post con su ejemplo


También hice un par de experimentos más con la cadena de entrada s = NULL;

por lo que he entendido, mientras no intentemos utilizar el valor de la variable de entrada - será NULL, pero en el momento en que intentemos asignar un valor a otra variable o simplemente la desactive, NULL desaparecerá, es decir, se asignará memoria a esta variable de entrada

 
Igor Makanu:

por lo que entiendo, mientras no estemos intentando utilizar el valor de una variable de entrada - este valor será NULL, pero en ese momento, si intentamos asignar el valor de esta variable de entrada a otra variable o simplemente desestablecer esta variable de entrada, este NULL desaparecerá, es decir, esta variable de entrada tendrá memoria asignada

El mecanismo de funcionamiento de la variable de entrada se ha descrito con detalle anteriormente.

 
fxsaber:

Da igual lo que haya dentro.

Porque no es NULL. A eso se refería el mensaje original.

hay (todavía) especificidad de desreferenciación de entidades (no hay punteros en mql, no es C, que haya entidades)

input es una const declarada al inicio. no se le puede dar físicamente el valor "NULL".

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

 
Nikolai Semko:

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

En MQL5 las entradas:

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é.

¿Cómo no se asigna memoria a una variable?
La memoria se asigna y la variable contiene basura arbitraria.
Y el hecho de que la cadena no emita ningún valor, es lógico que el buffer esté vacío.

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:

¿Cómo no se asigna memoria a una variable?
La memoria se asigna, pero la variable no contiene basura arbitraria.
Y el hecho de que la cadena no emita ningún valor, es lógico que el buffer esté vacío.

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