Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 599
Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
Bonjour !
Pouvez-vous me dire comment déplacer le curseur à, disons, la ligne 7 dans un document texte, pour extraire une sous-chaîne de cette position...
Qu'est-ce qui est le plus rapide - plusieurs fichiers texte avec une ligne ou un fichier avec plusieurs lignes ?
Vous devez savoir combien d'octets se trouvent sur une ligne et déplacer le pointeur sur 6 de ces valeurs à partir du début du fichier.
Bonjour !
Qu'est-ce qui est le plus rapide : plusieurs fichiers texte avec une seule ligne ou un seul fichier avec plusieurs lignes ?
Cela dépend de l'implémentation spécifique de l'algorithme et du problème à résoudre. Peut-être que dans votre cas, la première option sera plus rapide, mais je ne penserais pas aux performances à votre place.
Veuillez me dire comment déplacer le curseur, disons, sur la 7ème ligne d'un document texte, pour extraire la sous-chaîne déjà à partir de cette position...
Lisez la documentation standard. La section desopérations sur les fichiers. Par exemple, vous pouvez lire un fichier ligne par ligne avec FileReadString, un exemple tiré directement de la documentation :
Pouvez-vous me dire comment convertir la valeur d'un clic de souris sur un graphique en une valeur de prix ou vice versa ?
Dites-moi comment convertir la valeur d'un clic de souris sur un graphique en une valeur de prix ou vice versa.
Utilisez la fonction ChartXYToTimePrice. Voir "Opérations avec des graphiques" dans la documentation.
Utilisez la fonction ChartXYToTimePrice. Voir "Opérations avec des graphiques" dans la documentation.
Merci.
Ils ont donc fait une erreur avec CArrayObj. Au lieu de : CArrayObj test_objects ; Ils ont écrit : CArrayObj* test_objects, mais ont oublié de créer un destructeur pour celui-ci; Peut-être ont-ils mal configuré le modèle de mémoire pour fonctionner avec CArrayObj. Peut-être que les programmeurs ont simplement exagéré avec les pointeurs. Le diagnostic est clair : l'utilisation de pointeurs là où ils ne sont pas nécessaires provoque souvent des fuites.
Il y a une fonction dans une certaine classe. Je déclare un tableau d'objets CArrayObj dans celui-ci. J'y ajoute des objets de classe globale. Lorsque la fonction est terminée, le tableau d'objets lui-même n'est pas nécessaire. Les objets sont nécessaires, bien sûr.
Si je crée le tableau en tant que pointeur CArrayObj *test_objects, j'obtiendrai des objets non supprimés dans le journal, ce qui provoquera une erreur de mémoire à la fin.
Si je déclare le tableau comme CArrayObj test_objects, que j'y ajoute des objets, il s'avère que lorsque la fonction se termine et que les objets deviennent indisponibles, car le tableau avec les objets est en quelque sorte supprimé...
Si je déclare un tableau comme CArrayObj test_objects, que j'y ajoute des objets, il s'avère que lorsque la fonction se termine et que les objets deviennent indisponibles, car le tableau avec les objets est en quelque sorte supprimé...
C'est correct, car dans ce cas, vous placez CArrayObj test_objects sur la pile et dans l'espace d'adressage de la fonction. Lorsque la fonction se termine, l'espace d'adressage de la fonction est écrasé, y compris vos CArrayObj test_objects.
La fonction est terminée, le tableau d'objets lui-même n'est pas nécessaire. Les objets, bien sûr, sont nécessaires.
Rappelez-vous une fois pour toutes que si vous avez besoin d'objets à l'intérieur d'un CArrayObj, vous avez également besoin du CArrayObj lui-même. CArrayObj est un emballage obligatoire. Vous ne pouvez pas vous en passer, point final.
Si je crée un tableau sous la forme d'un pointeur CArrayObj *test_objects, j'obtiens des objets non supprimés dans le journal, ce qui conduit éventuellement à une erreur de mémoire insuffisante.
Dans ce cas, un pointeur vers un objet CArrayObj dans le tas est créé. Le tas est un segment de la mémoire de l'espace d'adressage du programme où la mémoire est allouée et supprimée manuellement à l'aide des opérateurs new et delete correspondants. Cela signifie que si vous écrivez new, il doit y avoir sa copie miroir de delete quelque part. En outre, le nouveau et l'effacement peuvent se trouver dans des parties différentes du programme, par exemple, dans des méthodes différentes :
Si, après l'appel de foo_analize, des objets sont encore nécessaires, l'opérateur de suppression peut être placé à un autre endroit, où les objets sont garantis d'être nécessaires. Un tel lieu universel peut être OnDeinit, par exemple, qui est appelé avant la fermeture du programme.
N'oubliez pas l'essentiel, s'il existe un nouvel opérateur, il doit toujours y avoir un opérateur de suppression pour celui-ci. Sinon, il y aura des fuites de mémoire. Les opérateurs de création et de suppression travaillant sur le même objet ne doivent pas nécessairement être "côte à côte" dans la même méthode. Delete peut se trouver n'importe où loin de l'allocation de mémoire, tant que delete a une référence à l'objet alloué dans le tas.
** Bien que cela soit vrai, nous ferions mieux d'éviter de telles constructions car nous devons toujours faire très attention à l'endroit et aux circonstances où l'opérateur delete est appelé, ce qui n'est pas toujours évident. Au lieu de cela, il suffit d'apprendre à utiliser les classes. Cette classe vous permet de placer et de supprimer automatiquement des objets sur le tas, sans utiliser les opérateurs new et delete :
Cette classe ne contient pas explicitement de pointeurs. Vous n'avez donc pas besoin d'utiliser à la fois new et delete. Après avoir quitté le programme, la classe libère automatiquement tous les objets CItem et CArrayObj, ce qui facilite grandement la vie du développeur.
C'est correct, car dans ce cas, vous placez CArrayObj test_objects sur la pile, et l'espace d'adresse de la fonction. Lorsque vous quittez la fonction, l'espace d'adressage de la fonction est écrasé, y compris vos CArrayObj test_objects.
Rappelez-vous une fois pour toutes que si vous avez besoin d'objets à l'intérieur d'un CArrayObj, vous avez besoin du CArrayObj lui-même. CArrayObj est un paquetage obligatoire. Vous ne pouvez pas vous en passer, point final.
Dans ce cas, un pointeur vers un objet CArrayObj dans le tas est créé. Le tas est un segment de la mémoire de l'espace d'adressage du programme où la mémoire est allouée et supprimée manuellement à l'aide des opérateurs new et delete correspondants. Cela signifie que si vous écrivez new, il doit y avoir sa copie miroir de delete quelque part. En outre, le nouveau et l'effacement peuvent se trouver dans des parties différentes du programme, par exemple, dans des méthodes différentes :
Si, après l'appel de foo_analize, des objets sont encore nécessaires, l'opérateur de suppression peut être placé à un autre endroit, où les objets sont garantis d'être nécessaires. Un tel lieu universel peut être OnDeinit, par exemple, qui est appelé avant la fermeture du programme.
N'oubliez pas l'essentiel, s'il existe un nouvel opérateur, il doit toujours y avoir un opérateur de suppression pour celui-ci. Sinon, il y aura des fuites de mémoire. Les opérateurs de création et de suppression travaillant avec le même objet ne doivent pas nécessairement être "côte à côte" dans la même méthode. La suppression peut se faire n'importe où, loin de l'allocation de mémoire, tant que la suppression a une référence à l'objet alloué dans le tas.
** Bien que cela soit vrai, nous ferions mieux d'éviter de telles constructions car nous devons toujours faire très attention à l'endroit et aux circonstances où l'opérateur delete est appelé, ce qui n'est pas toujours évident. Au lieu de cela, il suffit d'apprendre à utiliser les classes. Cette classe vous permet de placer et de supprimer automatiquement des objets sur le tas, sans utiliser les opérateurs new et delete :
Cette classe ne contient pas explicitement de pointeurs. Vous n'avez donc pas besoin d'utiliser à la fois new et delete. Après la sortie du programme, la classe libère automatiquement tous les objets CItem et CArrayObj, ce qui facilite la vie du développeur.
Merci. Mais je n'ai pas trouvé de réponse à ma question. Où dois-je mettre delete si je déclare un pointeur. Je répète, l'objet CArrayObj est déclaré dans une fonction... comment puis-je le supprimer dans Deinit() ?
Mais auparavant, j'ai résolu le problème de la façon suivante. Avant de terminer la fonction :
Merci. Je n'ai pas trouvé de réponse à ma question exacte. Où dois-je mettre delete si je déclare un pointeur. Encore une fois, l'objet CArrayObj est déclaré dans une fonction... comment puis-je le supprimer dans Deinit() ?
Ce n'est pas un club de télépathes. Vous n'avez pas joint votre code, vous pouvez donc décider vous-même où placer la suppression.
C'est faux.