Références de tableaux - page 6

 

Pour plus d'informations :

  1. Tous les tableaux dans MQL5 sont passés uniquement par référence (4 ou 8 octets dans la pile), donc n'ayez pas peur de passer des tableaux à l'intérieur des fonctions - pas de coûts spéciaux.
  2. Il est très dangereux de stocker des références à la mémoire réelle, en particulier des références à des tableaux contrôlés par le terminal lui-même(tampons d'indicateurs, tampons OHLC), car ils sont réellement modifiés/réalloués. En outre, il est impossible de sauvegarder les références non documentées entre les appels (sortie et entrée du code de script) à l'EA.
  3. Lorsqu'on transmet un tableau à une DLL, l'adresse de départ du bloc de données est spécifiée, et les dimensions doivent être spécifiées séparément.
 
mql5:

La première chose à comprendre est : POURQUOI ? Et à quoi cela sert-il ?

Vous ne voulez pas faire de liens, nous le ferons nous-mêmes.

Et grâce aux participants, grâce aux messages dans ce fil, j'ai découvert que la description dans l'aide est périmée...

Oui, c'est hilarant) . Mais vraiment, je ne pensais même pas que ça pouvait être publié dans l'aide.

Pouvez-vous déjà me parler de tous les drapeaux alors ?

Renat:

Pour plus d'informations :

  1. Tous les tableaux dans MQL5 sont passés par référence seulement (4 ou 8 octets dans la pile), donc n'ayez pas peur de passer des tableaux à l'intérieur des fonctions - pas de coûts spéciaux.

Je n'ai pas peur, je suis bien conscient que c'est peu coûteux. C'est juste un inconvénient.

  1. Il est très dangereux de stocker des références à la mémoire réelle, en particulier des références à des tableaux gérés par le terminal lui-même(tampons d'indicateurs, tampons OHLC), car ils sont réellement modifiés/réalloués. D'autant plus, les références non documentées entre les appels (sortie et entrée dans le code du script) de l'EA ne doivent pas être sauvegardées.

Veuillez développer ce point - peut-il y avoir une réallocation de mémoire pendant OnCalculate ? C'est des conneries.

Entre les appels, bien sûr, c'est clair.

Je ne veux pas avoir une fonction qui lie un indicateur ou un terminal en général, donc je vais utiliser la variante la plus sûre disponible.

 
TheXpert:

Plus de détails sur ce point s'il vous plaît - peut-il y avoir une réallocation de mémoire pendant OnCalculate ? C'est juste fou.


Pas "pendant" - entre.
 
TheXpert:

Plus de détails sur ce point s'il vous plaît - peut-il y avoir une réallocation de mémoire pendant OnCalculate ? C'est une déception.

Pour ce qui est des appels intermédiaires, bien sûr, c'est compréhensible.

Bien sûr, nous parlons d'une éventuelle redistribution entre les appels.

Le problème est que quelqu'un va sauvegarder la référence entre les appels par erreur ou explicitement, dans 99% des cas tout fonctionnera jusqu'au crash. Après cela, il y aura des pensées tout à fait attendues "c'est la faute de Metakvots".

Par exemple, un camarade a diffusé de telles pensées et a continué à le faire pendant plusieurs années, ne pouvant pas accepter que l'histoire entre les appels puisse être échangée/changée.

 
Renat:

Bien entendu, nous parlons d'une éventuelle redistribution entre les appels.

Le problème est que quelqu'un va forcément sauvegarder le lien entre les appels par erreur ou explicitement, dans 99% des cas tout fonctionnera jusqu'au crash. Après quoi, il y aura les réflexions attendues du type "C'est la faute de Metakwots".

"Craindre la culpabilité, c'est ne pas avancer" (c).

Et une dernière chose : il vaut mieux regretter ce qui a été fait, que ce qui n'a pas été fait.

Renat, disons que je suis d'accord pour dire que les variables de référence sont une source potentielle de problèmes, mais on peut dire cela de presque tous les outils. Parfois, les gens frappent d'autres personnes avec des tournevis. Il est inutile d'interdire les tournevis maintenant, et il est encore plus insensé de les retirer tout simplement de la production, car ils peuvent être fabriqués à la maison sans trop de problèmes.

Les "références" en tant qu'entité mql sont hautement souhaitables, pas même sous la forme de variables, mais comme une possibilité de retourner une référence ( lvalue ) à partir d'une fonction. Cela permettra de faire au moins des indexeurs gauches vraiment rapides pour les conteneurs et de donner toutes sortes d'autres fonctionnalités supplémentaires, comme par exemple :

MyTree.Search(Key).GetElement() = NewVal;

Et je comprends que les gens voudront retourner une référence à une variable locale à partir d'une fonction !

Et alors, quoi ? Oublier les références, parce qu'elles peuvent rendre la vie plus difficile aux imbéciles) ?

--

De telles limitations de mql5 (comme le manque de liens) incitent parfois fortement à "s'échapper vers la DLL", transformant MT5 en un simple "pilote de marché" assurant la communication avec le courtier. Mais l'idée originale était exactement le contraire - éliminer la nécessité d'utiliser des outils de programmation externes, car"tout est ici".

 

Il n'y a pas de retour en arrière possible, car nous visons une sécurité linguistique maximale.

Travailler avec des liens bruts est un pas solide et sûr vers un crash. Et il n'est pas permis de planter des programmes en retirant tout le système de virtualisation.

Notre décision est prise en toute connaissance de cause. MQL5 est utilisé pour écrire des programmes qui fonctionneront sur un très grand nombre d'ordinateurs, et sans intervention humaine.

 

Quoi qu'il en soit, j'espère que le principe est clair pour tous ceux qui en ont besoin. Je vais le garder pour l'instant, juste pour le garder pour moi. Mais elle le sera, et sera ouverte.

Je n'ai pas besoin d'expliquer que les références à des types de base comme int sont beaucoup plus faciles à faire sans aucun problème.

La seule question qui pose des problèmes de complexité et de mise en œuvre est celle de la portée de la variable sous-jacente. Il y a vraiment un large éventail de possibilités.

________

Eh bien, et pour la motivation, il convient de noter que les liens ouvrent toute une série de possibilités supplémentaires, comme les wrappers par exemple.

 
Les liens lvalue sont prévus...
 
mql5:
Les liens lvalue sont prévus...
Mec, tu aurais dû me le dire tout de suite) Je n'aurais pas lutté. Mais c'est génial.
 

Salutations à tous.


Je me demande si quelque chose a changé en huit ans ?

Ou bien, est-il toujours possible d'obtenir une adresse de tableau à partir de OnCalculate() uniquement en utilisant msvcrt.dll et la fonction memcpy ?

Ou est-ce que tout le monde continue à "glisser" des références à des tableaux à travers toute la structure de la classe (ou à organiser ses propres tableaux et à en copier le contenu à chaque fois) ?