Lesrésultats de l'exécution montrent que le compilateur agit contrairement à la logique :
Pour une chaîne constante, plus de mémoire est allouée que nécessaire (sa longueur ne peut en principe pas être augmentée).
Aucune mémoire supplémentaire n'est allouée pour une chaîne non constante (si sa longueur augmente, une nouvelle allocation de mémoire sera nécessaire)
Si l'utilisateur initialise une chaîne avec StringInitInit, plus de mémoire est allouée que nécessaire, parce que la taille du tampon est explicitement fixée par l'utilisateur et dans la plupart des cas, elle ne sera pas augmentée (l'utilisateur a déjà pensé au tampon final dont il a besoin et a fixé sa taille explicitement)
Pour une chaîne constante pure, la taille du tampon par StringBufferlen=0, ce qui signifie que la chaîne est constante :
string s1 = "_"; // исходное "чистое" присвоение константной строки
Print(StringBufferLen(s1)); // показывает 0 верно, не должно быть 260
Réaffecter une chaîne de caractères "prétendument" constante ne revient pas à travailler avec une constante, mais plutôt à créer exactement une variable dynamique avec une préaffectation de 260 caractères :
conststring s2 = s1; // динамическое создание переменной копированием данных из другой переменной (не константной строки)
Print(StringBufferLen(s2)); // показывает 260 верно
Pour une chaîne constante pure, la taille du tampon par StringBufferlen=0, ce qui signifie que la chaîne est constante :
Réallouer une chaîne "supposée" constante, ce n'est pas travailler avec une constante, c'est créer une variable dynamique avec une pré-allocation de 260 caractères :
Parce que dans la version actuelle, la fonction renvoie toujours une heure valide, même si la chaîne contient des déchets, et la date actuelle est renvoyée, ce qui est particulièrement étrange :
StringToTime("aaabbbccc") renvoie "2019.09.05 01:00:00" Est-ce normal ? Dans cette implémentation, la fonction est dangereuse pour la santé du tout. Par conséquent, une version avec des contrôles de correction est nécessaire.
Jusqu'à présent, nous avons analysé avec notre propre fonction,mais le problème est que l'heure peut être spécifiée dans différents formats.Et je n'ai pas vraiment envie de coder tous ces formats en réinventant la roue alors que le temps a déjà été implémenté dans MQL.
En principe, cela s'applique également aux autres fonctions de conversion de chaînes de caractères : StringToInteger, StringToDouble. Aucun contrôle de validité n'est prévu pour elles aussi.
p.s. Hmm, il s'avère queGetLastError() génère des erreurs dans ces cas. Je ne le savais pas. La documentation de ces fonctions ne dit rien de tel. Cela élimine le problème, bien que ce serait plus facile avec un bool.
erreur "la propriété existe déjà avec une valeur différente et sera ignorée".
Je l'ai utilisé pour la première fois. Aucun autre dossier ne l'a. Ne dépend pas de la valeur. Construire 2136.
Cette erreur se produit lors du travail avec des projets si la valeur de la propriété spécifiée dans le code source est en conflit avec la valeur dans les paramètres du projet.
Les propriétés du programme dans le fichier de projet ont la priorité sur les propriétés spécifiées dans le code source. Si vous spécifiez des propriétés à la fois dans le projet et dans le code source, ce sont les propriétés du projet qui seront utilisées.
MetaEditor позволяет удобно работать над большими проектами: объединять множество файлов в одну структуру, управлять настройками проекта и вести совместную разработку с командой программистов через версионное онлайн-хранилище MQL5 Storage. Что такое проект Проект — это отдельный файл с расширением "MQPROJ", в котором хранятся настройки...
Стилизатор позволяет быстро привести оформление исходного кода к рекомендуемому стандарту. Это делает код легко читаемым, выглядящем профессионально. Грамотно оформленный код гораздо проще читать и анализировать в последующем как его автору, так и другим пользователям. Чтобы запустить стилизатор, нажмите " Стилизатор" в меню "Сервис" или...
Si vous n'avez pas de compte, veuillez vous inscrire
Autorisez l'utilisation de cookies pour vous connecter au site Web MQL5.com.
Veuillez activer les paramètres nécessaires dans votre navigateur, sinon vous ne pourrez pas vous connecter.
Vous êtes connecté. L'authentification à deux facteurs a été désactivée. Configurez-la à nouveau et scannez un nouveau code QR, ou continuez avec l'authentification à deux facteurs désactivée.
Lesrésultats de l'exécution montrent que le compilateur agit contrairement à la logique :
Pour une chaîne constante pure, la taille du tampon par StringBufferlen=0, ce qui signifie que la chaîne est constante :
Réaffecter une chaîne de caractères "prétendument" constante ne revient pas à travailler avec une constante, mais plutôt à créer exactement une variable dynamique avec une préaffectation de 260 caractères :
Pour une chaîne constante pure, la taille du tampon par StringBufferlen=0, ce qui signifie que la chaîne est constante :
Réallouer une chaîne "supposée" constante, ce n'est pas travailler avec une constante, c'est créer une variable dynamique avec une pré-allocation de 260 caractères :
il est temps d'introduire les allocateurs ;)))
Pour rappel, il y a un bug avec le tampon de chaîne :
La fonction de la DLL peut être n'importe quoi.Je suggère d'ajouter une version étendue de la fonctionStringToTime à MQL dans le formulaire :
Parce que dans la version actuelle, la fonction renvoie toujours une heure valide, même si la chaîne contient des déchets, et la date actuelle est renvoyée, ce qui est particulièrement étrange :
StringToTime("aaabbbccc") renvoie "2019.09.05 01:00:00" Est-ce normal ? Dans cette implémentation, la fonction est dangereuse pour la santé du tout. Par conséquent, une version avec des contrôles de correction est nécessaire.
Jusqu'à présent, nous avons analysé avec notre propre fonction,mais le problème est que l'heure peut être spécifiée dans différents formats.Et je n'ai pas vraiment envie de coder tous ces formats en réinventant la roue alors que le temps a déjà été implémenté dans MQL.
En principe, cela s'applique également aux autres fonctions de conversion de chaînes de caractères : StringToInteger, StringToDouble. Aucun contrôle de validité n'est prévu pour elles aussi.
p.s. Hmm, il s'avère queGetLastError() génère des erreurs dans ces cas. Je ne le savais pas. La documentation de ces fonctions ne dit rien de tel. Cela élimine le problème, bien que ce serait plus facile avec un bool.Je soutiens la suggestion d'Alexey, une manipulation sûre des chaînes de caractères est essentielle pour éviter les erreurs cachées.
erreur "la propriété existe déjà avec une valeur différente et sera ignorée".
Je l'ai utilisé pour la première fois. Aucun autre dossier ne l'a. Ne dépend pas de la valeur. Construire 2136.
S'il vous plaît, ramenez l'ancien style de styler.
Maintenant je n'arrive pas à comprendre ce qui est censé fonctionner ici :
Cette pièce ressemblait à ça avant :
erreur "la propriété existe déjà avec une valeur différente et sera ignorée".
Je l'ai utilisé pour la première fois. Aucun autre dossier ne l'a. Ne dépend pas de la valeur. Construire 2136.
Cette erreur se produit lors du travail avec des projets si la valeur de la propriété spécifiée dans le code source est en conflit avec la valeur dans les paramètres du projet.
Propriétés du projet
S'il vous plaît, ramenez l'ancien style de styler.
Maintenant je n'arrive pas à comprendre ce qui est censé fonctionner ici :
Cette pièce ressemblait à ça avant :
Les ifs multiples imbriqués ne peuvent être sauvegardés par aucun alignement. Nous devons modifier le code pour le rendre lisible.
Les ifs multiples imbriqués ne peuvent être sauvegardés par aucun alignement. Vous devez modifier le code pour le rendre lisible.
Il n'y a pas d'imbrication multiple - le niveau supérieur est if, puis if else.
Je demande l'ancien style de l'époque où tout le monde ressemblait à ça :
- était sur une seule ligne et il n'y avait pas de décalage du texte suivant vers la droite.
Voici un exemple tiré de l'aide sur lesinstructions conditionnelles if-else (l' ancien stylet)
et c'est ce que fait le nouveau styler :