Mon approche. Le noyau est le moteur. - page 99

 
Реter Konow:
En bref, chaque fois que vous modifiez la valeur d'un paramètre utilisateur, cette valeur doit être convertie en une variable unifiée et immédiatement enregistrée dans un tableau d'octets partagé, que vous pouvez ensuite convertir en uint et écrire dans la ressource.

Vous devez avoir un paramètre utilisateur dans la structure de l'union. Lorsque vous changez le paramètre, la structure change avec un changement simultané du tableau d'int.

union c
{
  uint i[2];
  long width;
}cc;
 
cс.width = 200;

i[2] est une ressource utilisateur qui est lue par un autre programme.

Avec une seule ligne cc.width = 200 vous allez changer :

  1. Le paramètre responsable de la largeur,
  2. La structure contenant ce paramètre,
  3. Le tableau de la ressource lue par l'autre programme.

Et il n'y a pas de conversion ou de copie ici, juste une mise en correspondance.
 
Vasiliy Sokolov:


Je peux modifier les fonctions wrapper dans le fichier des propriétés de connexion et convertir chaque valeur utilisable en la variable correspondante de l'union, et créer un tableau d'octets à la volée. Mais les valeurs de texte qui doivent également être transmises sont converties en tableau d'octets à l'aide deStringToChar().

Cependant, cela supprime l'intérêt d'utiliser une union. Après tout, si je dois utiliserStringToChar() de toute façon, pourquoi ne pas tout assembler dans une chaîne de caractères et ensuite traduire la chaîne entière en octets en utilisantStringToChar() ?

 
Vasiliy Sokolov:

Vous devez avoir un paramètre utilisateur dans la structure de l'union. Lorsque vous changez le paramètre, la structure change avec un changement simultané du tableau d'int.

i[2] est une ressource utilisateur qui est lue par un autre programme.

Avec une seule ligne cc.width = 200 vous allez changer :

  1. Le paramètre responsable de la largeur,
  2. La structure contenant ce paramètre,
  3. Le tableau de la ressource qui est lu par un programme tiers.

Et il n'y a pas de conversion ou de copie ici, juste un mappage.

Vasily, vous oubliez que nous parlons d'une communication à double sens. Dans mon moteur, je peux tout lier aux syndicats, mais je ne peux pas être responsable du code utilisateur. Je ne peux que proposer des wrappers et les mettre dans les plugins.

Où est la garantie que l'utilisateur utilisera également les syndicats ? Ainsi, lorsqu'il appelle mes fonctions d'encapsulation, je dois moi-même prendre sa valeur et la convertir en une de mes variables à partir de mes unions dans son fichier de plugin.

 
Реter Konow:

Je peux modifier les fonctions wrapper dans le fichier des propriétés de connexion et convertir chaque valeur utilisable en la variable correspondante de l'union, et créer un tableau d'octets à la volée. Mais les valeurs de texte qui doivent également être transmises sont converties en tableau d'octets à l'aide deStringToChar().

Cependant, cela supprime l'intérêt d'utiliser une union. Après tout, si je dois utiliserStringToChar() de toute façon, pourquoi ne pas tout assembler dans une chaîne de caractères et ensuite traduire la chaîne entière en octets en utilisantStringToChar() ?

Parce que vous aurez une double analyse syntaxique. Vous allez tout convertir en chaîne, c'est très lent. Ensuite, on analyse la chaîne de caractères dans un tableau, ce qui est très rapide. Puis vous l'assemblez à nouveau en une chaîne - c'est très rapide. Ensuite, il faut analyser la chaîne de caractères dans les bons types - c'est très lent.

 
Реter Konow:

OK, mais qu'en est-il des textes ?

Ils doivent être convertis en octets viaStringToChar(). Tu ne peux pas utiliser le syndicat, n'est-ce pas ?

Oui, vous devez les traduire, mais c'est rapide, contrairement à l'analyse syntaxique.

 

Par exemple :

Voici la fonction wrapper dans le fichier du plug-indes propriétés de connexion:

string E_Last_10_bars_2_Close_price(string n = rare_value,  int Property = -1){return(GET_N_SET(11,n,Property));}

Cette fonction est appelée comme suit :

E_Last_10_bars_2_Close_price(Close[2]);

C'est-à-dire que l'utilisateur définit la valeur deClose[2] dans une cellule du tableau.

Close[2] - это значение дабл.

Ainsi, à l'intérieur de sa fonction wrapper dans son programme, je peux représenter la valeur(Close[2]) comme un tableau de chars.

Mais, dans la même cellule, l'utilisateur peut envoyer la valeur "Bonjour ! :)", et alors que faire ?

E_Last_10_bars_2_Close_price("Привет! :)");
 
 

Oh, Peter, tu as commencé avec le mauvais langage de programmation. Tu aurais dû apprendre quelque chose qui n'est pas strictement dactylographié.

En général, je vous ai compris, vous avez inventé votre propre langage non typé basé sur MQL. Vous avez contourné son typage strict en utilisant des chaînes de caractères. C'est une manœuvre !

 
Vasiliy Sokolov:

Oh, Peter, tu as commencé avec le mauvais langage de programmation. Tu aurais dû apprendre quelque chose qui n'est pas strictement dactylographié.

En général, je vous ai compris, vous avez inventé votre propre langage non typé basé sur MQL. Vous avez contourné son typage strict en utilisant des chaînes de caractères. C'est une manœuvre !

Ouais,)) Un coup avec un chevalier !

 

Si vous utilisez un tableau, vous devez décider si vous voulez que les données du tableau soient strictement numériques ou textuelles. S'il s'agit d'un texte, vous passez dans des chaînes de caractères. Si c'est réel, votre fonction doit ressembler à ça :

string E_Last_10_bars_2_Close_price(double n,  int Property = -1){return(GET_N_SET(11,n,Property));}