Erreurs, bugs, questions - page 2566

 
Vict:

Vous êtes allé un peu trop loin avec les avertissements à mon avis, il y a un manque de cohérence dans le jugement.

D'accord

Ici aussi, iln'y a pas de perte de données dans ce sens(soit 0, soit pas 0).

void OnStart()
{
        int i = -1;
        while ( ++i ); //Warning: expression not boolean
}

mais il y a un avertissement. Une approche uniforme était attendue

 

Résultat d'une tentative d'accès à une propriété d'une instance de classe à partir d'une fonction statique de la même classe :

2019.09.18 20:07:41.043 Test_exec (EURUSD,M5)   Access violation at 0x000001E9CCD2963C read to 0x0000000000000014 in 'D:\Alpari MT5\MQL5\Scripts\Test_exec.ex5'
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)      crash -->  000001E9CCD2963C 837B1400          cmp        dword [rbx+0x14], 0x0
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)                 000001E9CCD29640 0F8E8F020000      jle        dword 0x1e9ccd298d5
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)   
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)                 000001E9CCD29646 90                nop        
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)   
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)   00: 0x000001E9CCD2963C
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)   01: 0x000000B56CA2F120
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)   02: 0x000001E9CCD2A04D
Le compilateur était silencieux avant cela.
 

Ne pas initialiser une chaîne vide avec un terminal null.

void OnStart()
{      
   string str;
   StringInit(str, 100, 0);
   
   Print(StringLen(str));     
}

Résultat

2019.09.18 22:16:54.380 TestScript (EURUSD,H1)  0

Attendu

2019.09.18 22:16:54.380 TestScript (EURUSD,H1)  100

Note dans l'aide pour la fonction StringInit

Примечание

Если  character=0 и размер new_len>0, то будет распределен буфер строки указанного размера и заполнен нулями. 
Размер строки будет равен нулю, так как весь буфер заполнен терминаторами строки.

En fait, il n'y a pas de répartition.
C'est-à-dire l'attribution de cette façon, dix espaces

string str = "          ";

n'est pas la même chose que.

string str;
StringInit(str, 10, 0);

Le texte d'aide marqué en rouge ne correspond pas à un comportement logique.

 
Vict:

Vous en faites trop avec les avertissements à mon avis, pas assez de cohérence dans le jugement.

Les avertissements ne fonctionnent pas sur les opérations booléennes, maintenant j'ai accidentellement remarqué une coquille dans mon code, donc je l'ai reproduite :

#define               getAsk(dummy)          SymbolInfoDouble(_Symbol, SYMBOL_ASK)
#define               getBid(dummy)          SymbolInfoDouble(_Symbol, SYMBOL_BID)
//+------------------------------------------------------------------+
void OnStart()
  {
      double sl = 0.0,tp=0.0;
      if(sl != ! OrderStopLoss() || tp != OrderTakeProfit()) Print("");  
  }
//+------------------------------------------------------------------+

double OrderStopLoss()
{
   return(getAsk());
}

double OrderTakeProfit()
{
   return(getBid());
}
 
Roman:

Ne pas initialiser une chaîne vide avec un terminal null.

Résultat

Attendu

Note dans l'aide pour la fonction StringInit

En fait, il n'y a pas de répartition.
C'est-à-dire l'attribution de cette façon, dix espaces

n'est pas la même chose que.

Et cela ne semble pas correspondre à la logique du comportement, mis en évidence en rouge dans le texte d'aide.

Vous avez manqué la fonction StringBufferLen - elle renvoie la taille du tampon alloué. StringLen renvoie la longueur de la chaîne, c'est-à-dire jusqu'au caractère terminal, ou, s'il se trouve au tout début, la longueur 0. Buffer != string.

 
Stanislav Korotky:

Vous avez négligé la fonction StringBufferLen - elle renvoie la taille du tampon alloué. StringLen renvoie la longueur de la chaîne, c'est-à-dire jusqu'au caractère terminal, ou, s'il se trouve au tout début, la longueur 0. Buffer != string.

Sinon, elle ne se connaît pas elle-même.

 
Stanislav Korotky:

Vous avez négligé la fonction StringBufferLen - elle renvoie la taille du tampon alloué.
StringLen renvoie la longueur de la chaîne, c'est-à-dire jusqu'au caractère terminal, ou, s'il se trouve au tout début, la longueur 0. Buffer != string.

C'est clair, il s'agit d'initialiser une chaîne de caractères avec des zéros terminaux.
Pourquoi ne pas remplir stringInit(str, 10, 0) ; avec dix zéros terminaux ? Et retourner la longueur réelle de la chaîne.
Si vous voulez initialiser une chaîne vide, sans la remplir ! par exemple avec 100 caractères,
puis soit 100 espaces comme str = " many pokes at the keyboard ", soit initialiser la bêtise StringInit(str, 100, 65)
Je ne comprends pas pourquoi j'ai besoin de l'initialiser avec des déchets, il y en a déjà suffisamment ;))


 
Roman:

C'est compréhensible, il s'agit d'initialiser la chaîne avec des zéros terminaux.
Pourquoi ne pas remplir StringInit(str, 10, 0) ; avec dix zéros terminaux ? Et retourner la longueur réelle de la chaîne.
Si vous voulez initialiser une chaîne vide, sans la remplir ! par exemple avec 100 caractères,
puis soit 100 espaces comme str = " many pokes at the keyboard ", soit initialiser la bêtise StringInit(str, 100, 65)
Je ne comprends pas pourquoi j'ai besoin de l'initialiser avec des déchets, il y en a déjà suffisamment ;))


Qu'est-ce qui vous fait penser que ce n'est pas rempli ? C'est juste que la longueur dans la chaîne µl n'est pas stockée, elle est reconnue par le terminal zéro.

StringInit(str, 100, ' ');

Non ?

Et si vous avez besoin de zéros, il existe une classe String quelque part dans les entrailles de la std µl.

 
Vict:

Qu'est-ce qui vous fait penser qu'il n'est pas rempli ? C'est juste que la longueur dans la chaîne µl n'est pas stockée, elle est reconnue par le terminal zéro.

n'est-ce pas ?

Et si vous avez besoin de zéros, il existe une classe String quelque part dans les entrailles de la std µl.

Nah... Ça renvoie zéro de cette façon aussi. Et le troisième paramètre, ushort, requiert un code de caractères entiers.

Si je l'initialise en tant que str = " " ; et que je passe ensuite les données de la dll, tout est ok.
Mais si je l'initialise comme StringInit(str, 10, 0) alors les données n'arrivent pas. C'est parce que le code n'alloue pas de mémoire pour la chaîne de caractères de la taille requise.

Si j'avais un code pour l'espace, cela aurait probablement fonctionné, mais je n'ai pas trouvé un tel code dans différentes tables.
Nous devons allouer de la mémoire pour le nombre de futurs caractères qui iront ensuite dans la chaîne vide déjà initialisée.
Mais c'est nul pour initialiser la chaîne, pas kommelpho.
StringInit(str, 100, 0) ; devrait être rempli de nuls terminaux et retourner la longueur 100.

 
Roman:

S'il existait un code pour un espace, cela aurait pu fonctionner, mais je n'ai pas trouvé un tel code dans les différents tableaux.

)) Dupliquer

StringInit(s, 100, ' ');