Erreurs, bugs, questions - page 3021

 
fxsaber:

Le bogue est le décalage entre les deux fonctions, et non leur résultat, car il s'agit juste d'une question de documentation sur ce qu'il faut sortir lorsque le compte=0.

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

Erreurs, bogues, questions

Romain, 2021.05.07 22:07

Toute l'astuce se trouve dans la description de la fonction ;))

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

progression automatique ))
ce qui déroute le plus l'utilisateur.

A100:

Et comment un praticien expliquerait-il un résultat aussi contradictoire aux théoriciens ?

Résultat : 4:0

Prévu : 0:0

Ou aussi - pour corriger un peu la documentation ? Pas pour corriger les bugs après tout !

Mon explication est simple : l'une de ces fonctions standard a un bug - et je sais même laquelle


 
Roman:

Après cela, les développeurs ont déjàcorrigé, donc votre explication précédente n'est pas bonne.

Lesfonctions sont les mêmes (elles ne diffèrent que par le type, en fait le modèle), la description est la même (il y a même des références croisées), mais le résultat est différent.

 
A100:

Les développeurs ont déjà corrigé le problème, donc votre explication précédente ne fonctionne pas.

Qu'est-ce qui a été corrigé exactement ?
Il en a toujours été ainsi dans la documentation.

str1

str1


Avez-vous vérifié ce qui a été corrigé ? ))
Corrigé, divisé comme vous le vouliez.
3 caractères, par exemple.

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

Mais si vous passez 0 dans count, la chaîne entière avec un zéro final sera copiée automatiquement.
Même si la chaîne est vide, un zéro final sera copié.

char ch[];
int str = StringToCharArray( "", ch, 0, 0 );
    
Print("StringToCharArray "+(string)str);
2021.05.25 02:24:47.161 Test (AUDUSD,M1)   StringToCharArray 1
Et StringLen() ne renvoie pas un zéro final ;))
 
Roman:

Qu'avez-vous réparé exactement ?

Mais si vous passez 0 pour compter, la chaîne entière avec un zéro final sera copiée automatiquement.
Même si la chaîne est vide, le zéro final sera copié.

Pourquoi est-ce différent dansStringToShortArray? Veuillez expliquer brièvement, si possible, sans artifices ni références obscures à vos brillantes explications précédentes (qui ont finalement échoué) - en termes simples - pour un nigaud.

sans ; ) et autres symboles inappropriés dans ce sujet.

 
A100:

Pourquoi est-ce différent dansStringToShortArray? Veuillez expliquer brièvement, si possible, sans artifices ni références incompréhensibles à vos brillantes explications précédentes (qui ont finalement échoué) - en termes simples - pour un nigaud

sans ; ) et d'autres symboles non pertinents dans ce sujet.

Travaux de fractionnement

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

Je ne sais pas pourquoi le compte 0 ne fonctionne pas.
Peut-être que ce smart automatic sur le compte 0 ne fonctionne pas ici, et d'après l'aide, c'est déjà une inadéquation.
Et ça doit être une erreur.

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

Quoi qu'il en soit, soit il y a une erreur ici quine fonctionne pas sur lecompte 0,
, soit il y a une erreur dans StringToCharArray qui
fonctionnesur lecompte 0,
.

Pour vous faire comprendre le bien-fondé des explications, étudiez les bases du langage C, notamment la manipulation des chaînes de caractères.
Alors il n'y aura pas de questions.

 
Roman:

En bref, soit il y a une erreur ici que le compte 0 ne fonctionne pas,
soit il y a une erreur dans StringToCharArray que le compte 0 fonctionne.

Brillant !

 
A100:

Brillant !

Bien sûr que c'est génial. L'aide ne divulgue pas explicitement la gestion ducompte 0.
Mais si vous tournez la tête, passer une taille nulle au tableau et lui allouer une mémoire nulle est étrange, pour ne pas dire plus.
C'estpourquoi lecompte 0 déclenche un redimensionnement automatique jusqu'à la fin de la chaîne.
En toute logique, cela devrait aussi fonctionner dans StringToShortArray.
L'erreur aurait été mieux rendue, sans redimensionnement.
 
Roman:
Bien sûr que c'est génial. L'aide ne divulgue pas explicitement la gestion ducompte 0.
Mais si vous tournez la tête, passer une taille de tableau nulle et lui allouer une mémoire nulle est étrange, pour ne pas dire plus.
C'estpourquoi le compte 0 déclenche un redimensionnement automatique jusqu'à la fin de la chaîne.
En toute logique, cela devrait également fonctionner dans StringToShortArray.
Ils feraient mieux de retourner une erreur sans aucun redimensionnement.

Et dans

CharArrayToString

Pourquoi pas jusqu'au bout ?

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

Résultat : ""

 
A100:

Et dans

Pourquoi pas jusqu'au bout ?

Résultat : ""

Probablement parce qu'il n'y a pas de tableau dynamique [out] dansCharArrayToString.
Et le développeur a décidé que c'était inutile.
Bien que des logiques différentes dans des fonctions similaires entraînent davantage de confusion.

 
Roman:

Probablement parce qu'il n'y a pas de tableau dynamique [out] dansCharArrayToString.
Et le développeur a décidé que c'était inutile.

La chaîne de caractères qui en résulte est également une sorte de tableau dynamique.

Romain:

Une logique différente dans des fonctions similaires introduit cependant plus de confusion.

MegaGenius !