Erreurs, bugs, questions - page 2576

 
Roman:

Bien sûr, il est plus facile d'écrire tout un bazar en réponse qu'un test reproductible normal en remplaçant getData() par quelque chose. Qu'attendez-vous si UB sur UB et les conclusions sont fausses :

memcpy(cp,to,wcslen(to)*sizeof(wchar_t));  //в этой строке должен быть указатель sizeof(wchar_t *)

tout est là. Quelque chose ne va pas avec vos idées sur les cordes, d'où l'étalement urbain.

 
Vict:

Bien sûr, il est plus facile d'écrire tout un bazar en réponse qu'un test reproductible normal en remplaçant getData() par quelque chose. Qu'est-ce que vous attendez si UB sur UB et les conclusions sont fausses :

tout est là. Quelque chose ne va pas avec vos notions de chaînes de caractères, d'où les erreurs.

Il n'y a aucun moyen de fournir un code reproductible, puisque vous comprenez vous-même qu'il s'agit d'une dll utilisant des bibliothèques tierces.
Voilà pourquoi je pensais qu'il y avait une erreur dans l'exemple.
memcpy(cp,to,wcslen(to)*sizeof(wchar_t)) ;//cette chaîne doit contenirle pointeur sizeof(wchar_t *)

Si nous utilisons la fonction sans le pointeur,

memcpy(out, data, wcslen(data) * sizeof(wchar_t));

cela fera que la fin de la chaîne sera envahie de caractères inutiles. Regardez l'extrémité de la chaîne dans l'image.
Et il est logique que si nous copions une chaîne de caractères wchar_t * comme un pointeur, nous devrions passer la taille du pointeur et non celle du type.

Et si on utilise un pointeur,

memcpy(out, data, wcslen(data) * sizeof(wchar_t*));

la chaîne est claire et sans caractères supplémentaires.
Cela n'aurait pas d'importance, mais dans les deux cas, j'ai d'autres problèmes avec l'analyse syntaxique, c'est-à-dire que j'obtiens des erreurs ou des omissions dans les chaînes de caractères.

Et si j'utilise cette fonction, alors rien ne fuit, toute l'analyse syntaxique est bonne, seul un caractère supplémentaire à la fin du saut de ligne, puis il apparaît et ensuite disparaît.

wcsncpy(out, data, wcslen(data));

Je passe donc en revue un tas d'options, où peut être la cause, mais en utilisant memcpy sans le pointeur vers le sizeof, le résultat peut être vu dans la capture d'écran.

Je veux vérifier le terminal null d'une chaîne de caractères wchar_t * reçue, qu'il soit présent ou non.
Comment cela peut-il être fait ?

Dossiers :
 
Utilisation d'une fonction sans pointeur,

il laisse sans sans \0 à la fin.

Et si j'utilise un pointeur,

ici vous êtes hors limites

Et si j'utilise cette fonction, alors rien ne fuit, tout est analysé correctement, juste un caractère supplémentaire à la fin de la chaîne, il apparaît et disparaît.

sortir à nouveau sans \0. Voir docs

wcsncpy, wcsncpy_s

...

Si le nombre de caractères est atteint avant que la chaîne entière src ait été copiée, le tableau de caractères large résultant n'est pas à terminaison nulle.

...

HH : peut-être qu'il ne faut pas s'embêter avec les chaînes de caractères du tout ? sauvegarder les tableaux dans wchar_t et les exécuter, et dans µl convertir en chaîne de caractères si nécessaire https://www.mql5.com/ru/docs/convert/shortarraytostring

 
Vict:

ZS : peut-être qu'il ne faut pas s'embêter avec les chaînes de caractères du tout ? sauvegarder les tableaux dans wchar_t et les exécuter, et dans le µl convertir en chaîne de caractères si nécessaire.

Oh, merci )), pour l'astuce que wcsncpy coupe le zéro.
Oui, les tableaux sont laissés pour la fin, si les pointeurs ne fonctionnent pas, je vais utiliser des tableaux.

 

Le moteur du forum ne vous permet pas de créer un message à partir d'une seule image. Vous devez saisir du texte.

Tu dois mettre un espace.

 
fxsaber:

Le moteur du forum ne vous permet pas de créer un message à partir d'une seule image. Vous devez saisir du texte.

Je dois mettre un espace.

Cela semble logique : il s'agit d'un forum et l'essentiel est le texte. Une photo jointe à la quantité à la fois. Ce n'est pas un cimetière d'images.

 

J'ai terminé le code, il fonctionne dans MT4/5, mais j'ai eu une petite surprise

Comment remplacerTesterStop() dans MQL4 ?

?

 
Igor Makanu:

Comment puis-je remplacer TesterStop() dans MQL4 ?

ExpertRemove.

 
fxsaber:

ExpertRemove.

Je connais cette variante, mais j'ai vu des rapports selon lesquels ExpertRemove(0) ne peut pas être utilisé pour les conseillers experts dans le marché.

En général, j'utilise TesterStop() dans deux cas :

- au lieu de INIT_PARAMETERS_INCORRECT pour masquer le journal de l'optimiseur.

- s'il n'y a pas assez de fonds pour ouvrir un ordre, je ne l'ouvre pas, mais je ferme le test pour l'optimiser plus rapidement

 
Igor Makanu:

Je connais cette option.

Puis division par zéro.