Erreurs, bugs, questions - page 3011

 
Roman:

Ce paramètre ne sert pas à spécifier le nombre de caractères à copier, comme la sous-chaîne
, mais à spécifier le nombre de caractères transmis au tableau.
c'est-à-dire qu'il s'agit d'un contrôle de sécurité strict de taille C sur la taille des données transmises.
Cette taille allouera automatiquement de la mémoire pour le tableau dynamique.

Si vous devez copier trois éléments d'une chaîne de caractères, vous devez d'abord les extraire de la chaîne,
, puis les transmettre, en spécifiant la taille au fur et à mesure.

Tu veux dire comme ça ?

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

Je veux dire, pas vrai ?

Plus un comme la taille du zéro de terminaison.
StringLen renvoie la taille sans inclure le zéro.

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

Plus un comme la taille du zéro de terminaison.
StringLen renvoie la taille sans tenir compte de zéro.

J'ai donné un exemple provenant des développeurs et cela fonctionne.

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie

Bibliothèques : Bibliothèque de fonctions de hachage et de conversions

Ilyas, 2021.03.04 15:12

La fonction StringToArray capture la terminaison zéro si la longueur de la chaîne n'est pas spécifiée (historiquement)

Par conséquent, dans la fonction CryptDecodeA, il faut utiliser

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

au lieu de

StringToCharArray(InputText,scr);

 
Vitaly Muzichenko:

J'ai donné un exemple provenant des développeurs et cela fonctionne.


L'utilisation des bibliothèques n'était pas prévue dans cette question ;))
Il s'agit des nuances des bibliothèques.

 
Roman:

Plus un comme la taille du zéro de terminaison.
StringLen renvoie la taille sans tenir compte de zéro.

StringToCharArray est-il si incapable de récupérer la longueur d'une chaîne de caractères à partir d'une chaîne de caractères (d'autant plus que vous n'avez pas besoin de la calculer dans MQL) qu'une aide externe sous la forme d'un paramètre supplémentaire est nécessaire ? Et pourquoi les autres fonctions MQL n'ont-elles pas un"contrôle C" aussi strict?

 
A100:

StringToCharArray est-il si incapable d'extraire la longueur d'une chaîne de caractères à partir du type de chaîne (d'autant plus qu'elle n'a pas besoin d'être calculée dans MQL) qu'une aide externe sous la forme d'un paramètre supplémentaire est nécessaire ? Et pourquoi les autres fonctions MQL ne disposent pas d'un contrôle aussi strict ?

Cette question ne s'adresse probablement pas à moi, mais aux développeurs.
Mais ce paramètre est utilisé pour allouer la taille de la mémoire pour un tableau dynamique.
En d'autres termes, c'est un moyen pratique d'éviter d'allouer soi-même de la mémoire pour le tableau.
De plus, nous pouvons vérifier l'exactitude des données.
Le paramètre de taille supplémentaire est une pratique standard de sécurité rigoureuse dans sys.
Dans les autres fonctions où la taille n'est pas requise, ce paramètre est absent.
Habituellement, ce paramètre est utilisé lorsque l'on travaille avec des tableaux pour allouer de la mémoire.
C'est ce qui se passe dans ce cas.

 
Roman:

Cette question ne s'adresse probablement pas à moi, mais aux développeurs.
Mais ce paramètre est utilisé pour allouer de la mémoire pour un tableau dynamique.
Cela signifie qu'il est pratique pour vous de ne pas allouer la mémoire du tableau par vous-même.
De plus, nous aurons un contrôle de l'exactitude des données.

Et à quoi sert la vérification de l'exactitude ? - Supposons que j'ai, par exemple, écrit 0 - une valeur délibérément incorrecte.

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

Et tout a été copié correctement et le résultat : 7 - aucune erreur

 
A100:

Quel est le contrôle de l'exactitude ? - Disons que je l'ai fixé à 0, ce qui est une valeur délibérément incorrecte.

Et tout est copié correctement. Résultat : 7 - pas d'erreur

L'astuce se trouve dans la description de la fonction ;))

count=-1

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

progression automatique ))
ce qui rend l'utilisateur encore plus confus.

 
Roman:

Ce paramètre ne sert pas à spécifier le nombre de caractères que vous souhaitez copier en tant que sous-chaîne
mais à spécifier le nombre de caractères transmis au tableau.

L'aide n'est pas d'accord avec cette interprétation.

Le nombre d'éléments du tableau à copier. Définit la longueur de la chaîne de résultats. La valeur par défaut est -1, ce qui signifie que la copie se fera à la fin du tableau, ou à la borne 0. La borne 0 sera également copiée dans le tableau de destination, et la taille du tableau dynamique peut être augmentée pour correspondre à la taille de la chaîne si nécessaire. Si la taille du tableau dynamique est supérieure à la longueur de la chaîne, alors la taille du tableau ne sera pas réduite.

La description, bien entendu, est atas - la chaîne est désignée comme un tableau, le tableau comme une chaîne, confusion

Nombre d'éléments du tableau (chaîne) à copier. Spécifie la longueur de la chaîne (tableau) résultante. La valeur par défaut est -1, ce qui signifie que l'on copie jusqu'à la fin du tableau (chaîne), ou que l'on rencontre la borne 0.

 
Andrei Trukhanovich:

l'aide n'est pas d'accord avec cette interprétation.

L'aide est écrite pour mql et mql est écrit en ci ))
En connaissant les bases du c, il sera clair de quoi il s'agit.