Errores, fallos, preguntas - página 2566

 
Slava:

Con esta fundición, no hay pérdida de datos. O es 0 o no es 0.

Otro caso es cuando double -> cualquier tipo de entero (hasta int32 inclusive)

Estás jugando demasiado con las advertencias en mi opinión, hay una falta de coherencia en tu juicio

bool continuation()const {return this.last_level;}  // uint last_level
// expression not boolean	lrp_last_9.mq5	260	42
 
Vict:

Te has pasado un poco con las advertencias en mi opinión, hay una falta de coherencia en el juicio

De acuerdo

Aquí tampocohay pérdida de datos en este sentido( o0 o no 0)

void OnStart()
{
        int i = -1;
        while ( ++i ); //Warning: expression not boolean
}

pero hay una advertencia. Se esperaba un enfoque uniforme

 

Resultado de un intento de acceso a una propiedad de una instancia de clase desde una función estática de la misma clase:

2019.09.18 20:07:41.043 Test_exec (EURUSD,M5)   Access violation at 0x000001E9CCD2963C read to 0x0000000000000014 in 'D:\Alpari MT5\MQL5\Scripts\Test_exec.ex5'
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)      crash -->  000001E9CCD2963C 837B1400          cmp        dword [rbx+0x14], 0x0
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)                 000001E9CCD29640 0F8E8F020000      jle        dword 0x1e9ccd298d5
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)   
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)                 000001E9CCD29646 90                nop        
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)   
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)   00: 0x000001E9CCD2963C
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)   01: 0x000000B56CA2F120
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)   02: 0x000001E9CCD2A04D
El compilador no se pronunció al respecto.
 

No inicializa una cadena vacía con un null terminal.

void OnStart()
{      
   string str;
   StringInit(str, 100, 0);
   
   Print(StringLen(str));     
}

Resultado

2019.09.18 22:16:54.380 TestScript (EURUSD,H1)  0

Se espera

2019.09.18 22:16:54.380 TestScript (EURUSD,H1)  100

Nota en la ayuda de la función StringInit

Примечание

Если  character=0 и размер new_len>0, то будет распределен буфер строки указанного размера и заполнен нулями. 
Размер строки будет равен нулю, так как весь буфер заполнен терминаторами строки.

De hecho, no hay distribución.
Es decir, la asignación de esta manera, diez espacios

string str = "          ";

no es lo mismo que.

string str;
StringInit(str, 10, 0);

El texto de ayuda marcado en rojo no corresponde al comportamiento lógico.

 
Vict:

Te estás pasando con las advertencias en mi opinión, no hay suficiente consistencia en el juicio

Las advertencias no funcionan en las operaciones booleanas, ahora me he dado cuenta accidentalmente de una errata en mi código, así que lo he reproducido:

#define               getAsk(dummy)          SymbolInfoDouble(_Symbol, SYMBOL_ASK)
#define               getBid(dummy)          SymbolInfoDouble(_Symbol, SYMBOL_BID)
//+------------------------------------------------------------------+
void OnStart()
  {
      double sl = 0.0,tp=0.0;
      if(sl != ! OrderStopLoss() || tp != OrderTakeProfit()) Print("");  
  }
//+------------------------------------------------------------------+

double OrderStopLoss()
{
   return(getAsk());
}

double OrderTakeProfit()
{
   return(getBid());
}
 
Roman:

No inicializa una cadena vacía con un terminal null.

Resultado

Esperado

Nota en la ayuda de la función StringInit

De hecho, no hay ninguna distribución.
Es decir, la asignación de esta manera, diez espacios

no es lo mismo que.

Y no parece coincidir con la lógica del comportamiento, resaltada en rojo en el texto de ayuda.

Te ha faltado la función StringBufferLen - devuelve el tamaño del buffer asignado. StringLen devuelve la longitud de la cadena, es decir, hasta el carácter terminal, respectivamente, si está al principio - longitud 0. Buffer != string.

 
Stanislav Korotky:

Has pasado por alto la función StringBufferLen - devuelve el tamaño del buffer asignado. StringLen devuelve la longitud de la cadena, es decir, hasta el carácter terminal, respectivamente, si está al principio - longitud 0. Buffer != cadena.

De lo contrario, no se conoce a sí mismo.

 
Stanislav Korotky:

Has pasado por alto la función StringBufferLen - devuelve el tamaño del buffer asignado.
StringLen devuelve la longitud de la cadena, es decir, hasta el carácter terminal, respectivamente, si está al principio - longitud 0. Buffer != cadena.

Esto está claro, estamos hablando de inicializar una cadena con ceros terminales.
¿Por qué no llenar stringInit(str, 10, 0); con diez ceros terminales? Y devuelve la longitud real de la cadena.
Si quieres inicializar una cadena vacía, sin rellenarla, por ejemplo con 100 caracteres,
entonces o bien 100 espacios como str = " muchos golpes de teclado ", o bien inicializar la basura StringInit(str, 100, 65)
No entiendo por qué tengo que inicializarlo con basura, ya hay suficiente ))


 
Roman:

Es comprensible, estamos hablando de inicializar la cadena con ceros terminales.
¿Por qué no rellenar StringInit(str, 10, 0); con diez ceros terminales? Y devuelve la longitud real de la cadena.
Si quieres inicializar una cadena vacía, sin rellenarla, por ejemplo con 100 caracteres,
entonces o bien 100 espacios como str = " muchos golpes de teclado ", o bien inicializar la basura StringInit(str, 100, 65)
No entiendo por qué tengo que inicializar con basura, ya hay suficiente ))


¿Qué te hace pensar que no está rellenado? Es que la longitud en la cadena µl no se almacena, es reconocida por el terminal cero.

StringInit(str, 100, ' ');

¿No?

Y si necesitas ceros, hay una clase String en algún lugar de las entrañas de µl std.

 
Vict:

¿Qué te hace pensar que no está rellenado? Es que la longitud en la cadena µl no se almacena, es reconocida por el terminal cero.

¿No?

Y si necesitas ceros, hay una clase String en algún lugar de las entrañas de la µl std.

No... También devuelve cero de esa manera. Y el tercer parámetro ushort, requiere un código de carácter entero.

Si inicializo como str = " "; y luego paso los datos de la dll, todo está bien.
Pero si lo inicializo como StringInit(str, 10, 0) entonces los datos no llegan. Esto se debe a que el código no asigna memoria para la cadena con el tamaño necesario.

Si tuviera código para el espacio, probablemente habría funcionado, pero que no he encontrado tal código en diferentes tablas.
Necesitamos asignar memoria para el número de caracteres futuros que luego irán a la cadena vacía ya inicializada.
Pero la basura para inicializar la cadena, no kommelpho.
StringInit(str, 100, 0); debe rellenarse con nulos terminales y devolver la longitud 100.