Errores, fallos, preguntas - página 3011

 
A100:

Porque el cuarto parámetro

Necesito copiar los 3 primeros caracteres. Si quisiera copiar toda la cadena (7 caracteres incluyendo el 0 final), especificaría -1. Y si una parte no se puede copiar, ¿para qué necesito este parámetro?

Este parámetro no sirve para especificar cuántos caracteres se quieren copiar, como la subcadena
, sino para especificar cuántos caracteres se pasan al array.
, es decir, es una comprobación de seguridad estricta, tipo C, del tamaño de los datos que se pasan.
Este tamaño asignará automáticamente la memoria para el array dinámico.

Si quieres copiar tres elementos de una cadena, tienes que obtenerlos primero de la cadena,
, y luego pasarlos, especificando el tamaño tanto como pases.

 
Roman:

Este parámetro no sirve para especificar cuántos caracteres se quieren copiar, como la subcadena
, sino para especificar cuántos caracteres se pasan a la matriz.
es decir, es una comprobación de seguridad estricta del tamaño de los datos que se pasan.
Este tamaño asignará automáticamente la memoria para el array dinámico.

Si necesitas copiar tres elementos de una cadena, tienes que obtenerlos primero de la cadena,
, y luego tienes que pasarlos, especificando el tamaño tanto como pases.

¿Te refieres a esto?

StringToCharArray(InputText,scr,0,StringLen(InputText));
 
Vitaly Muzichenko:

Quiero decir, ¿no?

Más uno como el tamaño del cero de terminación.
StringLen devuelve el tamaño sin incluir el cero.

char ch[];
string InputText = "ABCDEF";
int    size      =  StringLen(InputText)+1;
    
StringToCharArray( InputText, ch, 0, size);
Print(GetLastError()); //0
 
Roman:

Más uno como el tamaño del cero de terminación.
StringLen devuelve el tamaño sin tener en cuenta el cero.

He dado un ejemplo de los desarrolladores y funciona

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

Bibliotecas: Biblioteca de funciones hash y conversiones

Ilyas, 2021.03.04 15:12

La función StringToArray captura la terminación cero si no se especifica la longitud de la cadena (históricamente)

Por lo tanto, en la función CryptDecodeA debe utilizar

StringToCharArray(InputText,scr,0,StringLen(InputText));

en lugar de

StringToCharArray(InputText,scr);

 
Vitaly Muzichenko:

He puesto un ejemplo de los desarrolladores y funciona.


El uso de las bibliotecas no estaba previsto en esta pregunta))
.

 
Roman:

Más uno como el tamaño del cero de terminación.
StringLen devuelve el tamaño sin tener en cuenta el cero.

¿Es StringToCharArray tan incapaz de recuperar la longitud de la cadena a partir de una cadena (especialmente porque no es necesario calcularla en MQL) que se necesita ayuda externa en forma de parámetro adicional? ¿Y por qué otras funciones MQL no tienen una"comprobación C" tan supuestamente estricta?

 
A100:

¿Es StringToCharArray tan incapaz de extraer la longitud de la cadena a partir del tipo de cadena (especialmente porque no necesita ser calculada en MQL) que se requiere ayuda externa en forma de un parámetro adicional? ¿Y por qué otras funciones MQL no tienen una comprobación tan supuestamente estricta?

Probablemente no sea una pregunta para mí, sino para los desarrolladores.
Pero este parámetro se utiliza para asignar el tamaño de la memoria de un array dinámico.
En otras palabras, es una forma conveniente de evitar la asignación de memoria para el array por ti mismo.
Además, podemos comprobar si es correcto.
El parámetro de tamaño adicional es una práctica estándar de seguridad rigurosa en sys.
En otras funciones en las que no se requiere el tamaño, este parámetro está ausente.
Normalmente este parámetro se utiliza cuando se trabaja con arrays para asignar memoria.
Esto es lo que ocurre en este caso.

 
Roman:

Probablemente no sea una pregunta para mí, sino para los desarrolladores.
Pero este parámetro se utiliza para asignar memoria a un array dinámico.
Significa que le conviene no asignar la memoria del array por sí mismo.
Además, obtendremos una comprobación de la corrección.

¿Y en qué consiste la comprobación de la corrección? - Supongamos que, por ejemplo, escribo 0, un valor deliberadamente incorrecto.

void OnStart()
{
    uchar ch[];
    const string text = "ABCDEF";
    Print( StringToCharArray( text, ch, 0, 0 ));
}

Y todo se copia correctamente y el resultado: 7 - sin error

 
A100:

¿Cuál es la comprobación de la corrección? - Entonces, digamos que lo pongo a 0, que es un valor incorrecto conocido.

Y todo se ha copiado correctamente. Resultado: 7 - sin error

El truco está en la descripción de la función ))

count=-1

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

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

 
Roman:

Este parámetro no sirve para especificar cuántos caracteres se quieren copiar como subcadena
sino para especificar cuántos caracteres se pasan a la matriz.

help no está de acuerdo con esta interpretación.

El número de elementos del array a copiar. Define la longitud de la cadena de resultados. El valor por defecto es -1, lo que significa que se copiará hasta el final del array, o el terminal 0. El terminal 0 también se copiará en el array de destino, y el tamaño del array dinámico se puede aumentar para que coincida con el tamaño de la cadena si es necesario. Si el tamaño de la matriz dinámica es mayor que la longitud de la cadena, el tamaño de la matriz no se reducirá.

La descripción, por supuesto, es atas - la cadena es referida como un array, el array como una cadena, la confusión

Número de elementos del array (cadena) a copiar. Especifica la longitud de la cadena resultante (array). Por defecto es -1, lo que significa copiar al final del array (cadena), o encontrarse con el terminal 0.