Errores, fallos, preguntas - página 2461

 
fxsaber:

¿Podría ampliar este punto?

Lo que sigue es mi opinión subjetiva, si me equivoco en algo, estaré encantado de ayudar.


StringLen solía funcionar O(n) hasta el primer carácter NULL (0x0000) en la cadena, ahora funciona O(1).
La longitud de las cadenas siempre podía truncarse mediante StringSetCharacter(str, pos, 0x00), pero por alguna razón introdujeron StringSetLength.

Lo más probable es que el analizador haya resuelto la tarea de aceleración del código al trabajar con cadenas.
La tarea de acelerar el código fue resuelta y a nadie le importa que la mitad de la función ahora maneje caracteres NULL en la cadena y la otra mitad no.

#define  PRINT(x) Print(#x, ":", string(x))

void OnStart(){  
   string str = "123456789";
   PRINT(str);
   PRINT(StringLen(str));
   
   PRINT(StringSetCharacter(str, 7, 0x00));
   PRINT(StringLen(str));
   
   str += "\x00" + str;
   PRINT(StringLen(str));
   
   str += str;
   PRINT(str);
   PRINT(StringLen(str));
   
   ushort array[];
   PRINT(StringToShortArray(str, array));
   ArrayPrint(array);
   
   PRINT(StringLen(str));
   PRINT(StringLen(ShortArrayToString(array)));
   PRINT(StringLen(ShortArrayToString(array, 0, StringLen(str))));
} 

El resultado:

2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      str:123456789
2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      StringLen(str):9
2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      StringSetCharacter(str,7,0x00):true
2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      StringLen(str):7
2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      StringLen(str):15
2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      str:1234567
2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      StringLen(str):30
2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      StringToShortArray(str,array):31
2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      49 50 51 52 53 54 55  0 49 50 51 52 53 54 55 49 50 51 52 53 54 55  0 49 50 51 52 53 54 55  0
2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      StringLen(str):30
2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      StringLen(ShortArrayToString(array)):7
2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      StringLen(ShortArrayToString(array,0,StringLen(str))):7
 
Sergey Dzyublik:

Lo que sigue es mi opinión subjetiva, si me equivoco en algo, estaré encantado de ayudar.


StringLen solía funcionar O(n) hasta el primer carácter NULL (0x0000) en la cadena pero ahora funciona O(1).
La longitud de las cadenas siempre podía truncarse mediante StringSetCharacter(str, pos, 0x00), pero por alguna razón introdujeron StringSetLength.

Lo más probable es que se haya resuelto la tarea de aceleración del código al trabajar con cadenas.
La tarea de acelerar el código fue resuelta y a nadie le importa que la mitad de la función ahora maneje caracteres NULL en la cadena y la otra mitad no.


El resultado:

Por favor, contenga sus emociones.
La próxima vez que utilices un lenguaje soez, tendrás que ser expulsado, no estamos en un pub. Y ya no está de moda decir palabrotas en un bar.
 
Sergey Dzyublik:

StringLen solía funcionar O(n) hasta el primer carácter NULL (0x0000) en la cadena, ahora funciona O(1)

Sólo se han corregido parcialmente los errores . .. ¿¡Por qué no!? En mi memoria StringLen siempre ha funcionado correctamente (al menos en x32)
 
Sergey Dzyublik:
A los desarrolladores:
Por favor, añada la capacidad de especificar la generación forzada de código para el operador de asignación por defecto (constructor de copia):

Es un poco complicado. Es más fácil utilizar la analogía del constructor por defecto:

1) cualquier operador de asignación anula el operador de asignación por defecto

2) cualquier operador de copia anula el operador de copia por defecto

 
A100:
Sólo errores parcialmente corregidos ... ¿¡Por qué no!?

Debido a que MQL no tiene una idea consistente cuando se trata de cadenas con caracteres NULL este es el problema.
Por ejemplo, StringToShortArray admite caracteres NULL en una cadena, mientras que la función inversa ShortArrayToString no...

En consecuencia, se dedica más tiempo a detectar fallos y a buscar soluciones que a resolver tareas concretas.

 
A100:

Es un poco complicado. Es más fácil utilizar la analogía del constructor por defecto:

1) cualquier operador de asignación anula el operador de asignación por defecto

2) cualquier operador de copia anula el operador de copia por defecto

No necesito deshacer; necesito, por el contrario, una generación forzada.
MQL no tiene ninguna funcionalidad para la copia profunda de tipos complejos, y en operador de asignación y constructor de copia se implementan por defecto.

 
Sergey Dzyublik:

Como no hay una idea consistente en MQL cuando se trata de cadenas con caracteres NULL, este es el problema.
Por ejemplo, StringToShortArray admite caracteres NULL en una cadena, mientras que su función inversa ShortArrayToString no...

Por un lado sí, por otro lado se dice explícitamente en la Documentación: "o hasta que se cumpla el terminal 0".

 
Sergey Dzyublik:
Bueno, no está muy claro por qué se arrastraron las líneas cero de los pluses en primer lugar.
 
A100:

Por un lado sí, por otro lado se dice explícitamente en la Documentación(que no lo hace)

YStringToShortArray dice lo mismo:

 Количество элементов массива для копирования. Определяет длину результатной строки. По умолчанию -1, что означает копирование до конца массива, либо до встречи терминального 0.

Sin embargo, esto no impide que maneje adecuadamente los caracteres NULL en la cadena.

 
Hola. La versión móvil de MT5 no se conecta a mi broker Alpari. ¿Cuál es el problema? ¿Se arreglará esto en algún momento?
Razón de la queja: