Errores, fallos, preguntas - página 3021

 
fxsaber:

El error es la discrepancia entre las dos funciones, no el resultado, porque es sólo una cuestión de documentación de lo que debe salir cuando count=0.

No, también existe el principio de uniformidad. el fallo es evidente. si no entiendes por qué es un fallo, es tu problema.

 
fxsaber:

El error es el desajuste entre las dos funciones, no su resultado, ya que es sólo una cuestión de documentación de lo que debe salir cuando count=0.

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

Errores, fallos, preguntas

Roman, 2021.05.07 22:07

Todo el truco está en la descripción de la función ))

[in]  Количество элементов массива для копирования. Определяет длину результатной строки. 
По умолчанию -1, что означает копирование до конца массива, либо до встречи терминального 0. 
Терминальный 0 также будет скопирован в массив-приемник, 
при этом размер динамического массива может быть увеличен при необходимости под размер строки. 
Если размер динамического массива больше длины строки, то размер массива уменьшен не будет. 

progreso automático ))
lo que confunde más al usuario.

A100:

¿Y cómo explicaría un profesional un resultado tan contradictorio a los teóricos?

Resultado: 4:0

Esperado: 0:0

O también - para corregir un poco la documentación? Bueno, al fin y al cabo, no para arreglar los errores.

Mi explicación es sencilla: una de estas funciones estándar tiene un error, e incluso sé cuál es


 
Roman:

Después de eso los Desarrolladores ya hancorregido, por lo que tu explicación anterior no sirve

Las funciones son las mismas (sólo difieren en el tipo, de hecho la plantilla), la descripción es la misma (incluso hay referencias cruzadas), pero el resultado es diferente

 
A100:

Los desarrolladores ya lo han arreglado, así que tu explicación anterior no sirve

¿Qué se ha arreglado exactamente?
Siempre ha sido así en la documentación.

str1

str1


¿Has comprobado lo que se ha arreglado? ))
Arreglado, dividido como querías.
3 caracteres, por ejemplo.

char ch[];
int str = StringToCharArray( "ABCDEF", ch, 0, 3 );
    
Print("StringToCharArray "+(string)str);
Print("ch[] ",CharToString(ch[0]), CharToString(ch[1]), CharToString(ch[2]));
Print("GetLastError ", GetLastError());         

2021.05.25 02:08:33.329 Test (AUDUSD,M1)   StringToCharArray 3
2021.05.25 02:08:33.329 Test (AUDUSD,M1)   ch[] ABC
2021.05.25 02:08:33.329 Test (AUDUSD,M1)   GetLastError 0

Pero si pasas 0 en count, se copiará automáticamente toda la cadena con un cero final.
Incluso si la cadena está vacía, se copiará un cero final.

char ch[];
int str = StringToCharArray( "", ch, 0, 0 );
    
Print("StringToCharArray "+(string)str);
2021.05.25 02:24:47.161 Test (AUDUSD,M1)   StringToCharArray 1
Y StringLen() no devuelve un cero final ))
 
Roman:

¿Qué has arreglado exactamente?

Pero si pasas 0 a count, se copiará automáticamente toda la cadena con un cero final.
Incluso si la cadena está vacía, se copiará el cero final.

¿Por qué es diferente enStringToShortArray? Por favor, explique brevemente, sin astucias innecesarias ni referencias inexplicables, sus anteriores y brillantes explicaciones (que al final fracasaron), en términos sencillos, para un dummie

sin ; ) y otros símbolos inapropiados en este tema.

 
A100:

¿Por qué es diferente enStringToShortArray? Por favor, explique brevemente, si es posible, sin trucos ni referencias incomprensibles a sus brillantes explicaciones anteriores (que al final fracasaron) - en términos simples - para un dummie

sin ; ) y otros símbolos irrelevantes en este tema.

Obras divididas

ushort sh[];
int str = StringToShortArray( "ABCDEF", sh, 0, 3 );
    
Print("StringToShortArray "+(string)str);
Print("sh[] ",ShortToString(sh[0]), ShortToString(sh[1]), ShortToString(sh[2]));
Print("GetLastError ", GetLastError()); 
2021.05.25 03:10:07.696 Test (AUDUSD,M1)   StringToShortArray 3
2021.05.25 03:10:07.696 Test (AUDUSD,M1)   sh[] ABC
2021.05.25 03:10:07.696 Test (AUDUSD,M1)   GetLastError 0

No sé por qué la cuenta 0 no funciona.
Tal vez este automático inteligente en la cuenta 0 no funciona aquí, y de acuerdo con la ayuda, ya es un desajuste.
Y debe ser un error.

ushort sh[];
int str = StringToShortArray( "ABCDEF", sh, 0, 0 );
    
Print("StringToShortArray "+(string)str);
//Print("sh[] ",ShortToString(sh[0]), ShortToString(sh[1]), ShortToString(sh[2]));
Print("GetLastError ", GetLastError()); 
2021.05.25 03:12:00.176 Test (AUDUSD,M1)   StringToShortArray 0
2021.05.25 03:12:00.176 Test (AUDUSD,M1)   GetLastError 0

Detodos modos, o hay un error aquí queno funciona en la cuenta 0,
o hay un error en StringToCharArray que
funcionaen lacuenta 0.

Para que entiendas la solidez de las explicaciones, estudia los fundamentos del lenguaje C, especialmente el manejo de cadenas.
Entonces no habrá preguntas.

 
Roman:

En resumen, o hay un error aquí que la cuenta 0 no funciona,
o hay un error en StringToCharArray que la cuenta 0 sí funciona.

¡Brillante!

 
A100:

¡Brillante!

Por supuesto que es una genialidad. La ayuda no revela explícitamente el manejo de lacuenta 0.
Pero si le das vueltas a la cabeza, pasar un tamaño cero al array y asignarle memoria cero es extraño, por decirlo suavemente.
Por eso lacuenta 0 activa el redimensionamiento automático hasta el final de la cadena.
Por lógica, debería funcionar también en StringToShortArray.
El error habría sido devuelto mejor, sin ningún tipo de redimensionamiento.
 
Roman:
Por supuesto que es una genialidad. La ayuda no revela explícitamente el manejo de lacuenta 0.
Pero si le das vueltas a la cabeza, pasar un tamaño de array cero y asignarle memoria cero es extraño, por decirlo suavemente.
Por eso la cuenta 0 activa el redimensionamiento automático hasta el final de la cadena.
Por lógica, debería funcionar también en StringToShortArray.
Será mejor que devuelvan un error sin ningún tipo de cambio de tamaño.

Y en

CharArrayToString

¿Por qué no hasta el final?

void OnStart()
{
    const uchar array[] = { 'A', 'B', 'C' };
    const int start = 0, count = 0;
    Print(CharArrayToString( array, start, count ));
}

Resultado: ""

 
A100:

Y en

¿Por qué no hasta el final?

Resultado: ""

Probablemente porque no hay un array dinámico [out] enCharArrayToString.
Y el desarrollador decidió que esto era innecesario.
Aunque una lógica diferente en funciones similares causa más confusión.