Erreurs, bugs, questions - page 2116

 
A100:

Lesarguments de la fonction ne sont pas calculés de droite à gauche

Résultat de la chaîne (*) : 0:5041

C'était prévu dans les deux cas : 0:0

Il ne s'agit pas d'une erreur. Le compilateur décide lui-même dans quel ordre calculer les arguments.

Il faut juste en tenir compte.

 
Koldun Zloy:

Il ne s'agit pas d'une erreur. Le compilateur décide lui-même dans quel ordre calculer les arguments.

L'erreur est la suivante : jusqu'à récemment, l'ordre était strictement défini par https://www.mql5.com/ru/forum/1111/page2040#comment_5858419(notez la date et l'extrait de la documentation : garanti). Puis l'ordre a été discrètement modifié (y compris dans la documentation), et il a pu être modifié d'une manière civilisée - via le site https://www.mql5.com/ru/forum/1111/page2042#comment_5860752. Mais comment l'utilisateur doit-il en être informé ? L'utilisateur doit-il le deviner ? Ou encore, avant d'utiliser un outil, consultez la documentation ?

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 2017.10.04
  • www.mql5.com
Общее обсуждение: Ошибки, баги, вопросы
 

Erreurs de compilation et autres

#define MACRO( X )      #X
void OnStart()
{
        Print( MACRO( AC/DC    )); //нормально
        Print( MACRO( AC\\DC   )); //error: '\' - illegal escape sequence
        Print( MACRO( ABC\nDEF )); //error: '\' - illegal escape sequence
        Print( MACRO( 'ABC'    )); //error: '' - single quote needed
        Print( MACRO( "ABC     )); //error: '' - double quotes are needed
        Print( MACRO( "ABC"    )); //Результат: ABC вместо "ABC"
        Print( MACRO( '"'ABC   )); //нормально
}
 
A100:

L'erreur est la suivante : jusqu'à récemment, l'ordre était strictement défini par https://www.mql5.com/ru/forum/1111/page2040#comment_5858419(notez la date et l'extrait de la documentation : garanti). Puis l'ordre a été discrètement modifié (y compris dans la documentation), et il a été possible de le changer d'une manière civilisée - via le site https://www.mql5.com/ru/forum/1111/page2042#comment_5860752. Mais comment l'utilisateur doit-il en être informé ? L'utilisateur doit-il le deviner ? Ou de consulter la documentation avant d'utiliser un outil ?

Vous n'avez tout simplement pas à écrire un code qui dépend de l'ordre de calcul des arguments.

En C++, le compilateur a le droit de mettre une fonction en ligne même si elle ne possède pas le mot clé inline.

En MQL, il n'y a pas de mot clé inline, le compilateur n'insère les fonctions qu'à sa discrétion.

L'ordre des calculs de droite à gauche était apparemment dû au fait que les arguments dans cet ordre sont placés sur la pile,

mais ils peuvent aussi passer par des registres.

Et pour les fonctions intégrées, il n'y a pas de passage d'arguments en tant que tel.

 
Koldun Zloy:

1. Vous n'avez tout simplement pas besoin d'écrire un code qui dépend de l'ordre dans lequel les arguments sont calculés.

2. En C++, le compilateur a le droit de mettre en ligne une fonction même si elle ne possède pas le mot clé inline.

3. Dans MQL, il n'y a pas de mot-clé inline, le compilateur n'intègre les fonctions qu'à sa propre discrétion.

4. L'ordre des calculs de droite à gauche semble être lié au fait que les arguments dans cet ordre sont placés sur la pile,

mais ils peuvent aussi être passés par des registres.

5. Et il n'y a pas du tout de passage d'argument pour les fonctions intégrées.

1. Pourquoi ne le serait-il pas si l'ordre inverse est garanti dans la documentation et si le code est plus simple et plus clair dans ce cas ? Autant refuser d'utiliser les priorités de l'opération 5 + (2*3) et exiger de mettre des parenthèses (5 + (2*3)) partout. - au cas où elle serait soudainement modifiée

2. Le compilateur C++ impose certaines exigences aux fonctions intégrées, ce qui exclut une telle situation https://www.mql5.com/ru/forum/1111/page2136#comment_6454818.

3. c'est ainsi qu'il a été proposé de l'introduire

4. Dans les registres (contrairement à la pile), les arguments peuvent être placés dans n'importe quel ordre, y compris dans l'ordre inverse.

5. Ce n'est pas l'ordre de passage qui importe - c'est l'ordre de calcul des arguments, et c'est le cas pour toute fonction ayant plus d'un argument. Et le C++ en tient compte avant de rendre (ou de ne pas rendre) une fonction inline (voir point 2)

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 2018.01.31
  • www.mql5.com
Общее обсуждение: Ошибки, баги, вопросы
 
A100:

1. Pourquoi pas, si l'ordre inverse est garanti dans la documentation et que le code est plus simple et plus clair. Nous pourrions tout aussi bien refuser d'utiliser 5 + (2*3 ) et exiger de mettre des parenthèses (5 + (2*3)) partout. - au cas où il serait soudainement modifié

2. Le compilateur C++ impose certaines exigences aux fonctions intégrées, ce qui exclut une telle situation https://www.mql5.com/ru/forum/1111/page2136#comment_6454818.

3. c'est ainsi qu'il a été proposé de l'introduire

4. Dans les registres (contrairement à la pile), les arguments peuvent être placés dans n'importe quel ordre, y compris dans l'ordre inverse.

5. Ce n'est pas l'ordre de passage qui importe - c'est l'ordre de calcul des arguments, et c'est l'ordre de toute fonction ayant plus d'un argument. Et le C++ en tient compte avant de rendre (ou de ne pas rendre) une fonction inline (voir point 2)

3. Je ne sais pas ce que ça vous rapporte. Voulez-vous interdire au compilateur d'incorporer des fonctions sans spécifier explicitement inline ?

2. Je ne sais pas ce que vous voulez dire.

4. Je suggérais simplement à quoi se rapportait cet ordre et son annulation. Je ne pense pas que cela ait été fait par accident et il en sera toujours ainsi à partir de maintenant. Il n'y a rien de terrible à cela.

5. Vous vous trompez. En C++, l'ordre de calcul des arguments n'est pas défini.

1. J'écris en C++ depuis de nombreuses années et je n'ai jamais trouvé que cela posait problème.


 
Koldun Zloy:

3. Je ne sais pas ce que ça va vous apporter. Voulez-vous empêcher le compilateur d'incorporer des fonctions sans spécifier explicitement inline ?

4. J'ai simplement suggéré l'objet de cet ordre et de son annulation. Je ne pense pas que cela ait été fait par accident et il en sera toujours ainsi maintenant. Il n'y a rien de terrible.

5. Vous vous trompez. En C++, l'ordre de calcul des arguments est indéfini.

3. je suggérais que le compilateur ne devrait pas être autorisé à changer l'ordre de calcul des arguments pour les fonctions sans inlines.

5. L'ordre de calcul est défini par l'implémentation (le compilateur) et il est assez concret (soit de droite à gauche, soit de gauche à droite), et ici, par exemple :

void OnStart()
{
    ResetLastError();
    Print( GetLastError(), ":", StringGetCharacter( "abc", 1024 ), ":", GetLastError());
}

l'ordre n'est pas clair : 2-1-3 ou 2-3-1 ou autre.

Résultat : 5041:0:5041.

Attendu : 0:0:5041 de gauche à droite ou

5041:0:0 de droite à gauche

 
A100:

l'ordre n'est pas clair : 2-1-3 ou 2-3-1 ou autre.

Je ne comprends pas pourquoi écrire un code qui est manifestement ambigu ?

 
fxsaber:

Je ne comprends pas pourquoi écrire un code qui est manifestement ambigu ?

Une question similaire pour vous https://www.mql5.com/ru/forum/1111/page2037#comment_5842347

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 2017.10.02
  • www.mql5.com
Общее обсуждение: Ошибки, баги, вопросы
 

Il n'y avait aucune ambiguïté.

Raison: