Discussion de l'article "Se débarrasser des DLL auto-produites" - page 2

 

L'auteur de l'article est très reconnaissant pour une présentation aussi accessible des informations sur l'interopérabilité IPC sans dll de vélo.

Travailler avec la mémoire me semble assez compliqué, mais l'approche est claire, à l'exception de quelques questions, j'espère que des personnes bien informées aideront à comprendre :

1. Avec l'aide de memcpy, nous copions une variable de deux octets, short, dans le tableau uchar[2], comment l'information est-elle placée dans le tableau lui-même ?

Quel sera le format des valeurs à l'index 0 et 1 du tableau uchar ?

uchar dst[2];
short src = 13331;
memcpy(dst, src, sizeof(src));

uchar[0] = ?, uchar[1] = ?;

La valeur est divisée par octet par octet et écrite dans le tableau, ok ... Je pense que j'ai compris.

Je n'arrive pas à comprendre quelles valeurs tombent dans ce tableau et comment en obtenir la valeur originale, la question n'est pas que je ne puisse pas afficher ces valeurs à l'écran.


2. Comment remplir correctement le tableau uchar[4] avec des valeurs de différents types lors de la copie memcpy, par exemple :

uchar dst[4];
short src1 = 2;
short src2 = 13331;
memcpy(dst, src1, sizeof(src1));
memcpy(dst, src2, sizeof(src2)); // Je suppose qu'en écrivant à dst, l'adresse doit être spécifiée avec un décalage de 2 octets après l'écriture de src1.

On a l'impression que la réponse est triviale et que tout se fait simplement, mais comment l'écrire correctement ?

 

Avez-vous essayéPrint?

 

Le quatrième exemple donne l'erreur suivante : 'operator=' - illegal operation use SAMPLE_04.mq4 34 7

#property copyright ""

#property link      ""

#property version   ""

#property strict

//Пример 4. Копирование структур средствами MQL5

//---

struct str1

{

  double d; // 8 байт

  long   l; // 8 байт

  int i[3]; // 3 * 4 = 12 байт

};

//---

struct str2

{

  uchar c[ 8 + 8 + 12 ]; // размер структуры str1

};

//+------------------------------------------------------------------+

//| Script program start function                                    |

//+------------------------------------------------------------------+

void OnStart(){

  str1 src;   // 

  src.d = -1; // 

  src.l = 20; //

  //--- заполняем параметры структуры

  ArrayInitialize(src.i, 0); 

  str2 dst;  //  

  //--- превратили структуру в байтовый массив

  dst = src; //   <----- Ошибка

}


Je comprends l'idée de la section mémoire, mais peut-être que les définitions ne sont pas tout à fait correctes ?

Pouvez-vous me dire quelle en est la raison ?

Merci d'avance.
 
_SERG_:

L'idée d'un emplacement mémoire est claire, mais il y a peut-être quelque chose qui cloche dans les définitions ?

Quelle en est la raison ?

Les structures de types différents ne peuvent plus être copiées, MQL a supprimé cette possibilité.

utiliser union

//Exemple 4. Copie de structures à l'aide de MQL5
//---
struct str1
{
  double d; // 8 octets
  long   l; // 8 octets
  int i[3]; // 3 * 4 = 12 octets
};

//---
struct str2
{
  uchar c[ 8 + 8 + 12 ]; // taille de la structure str1
};

union str12 { str1 s1; str2 s2; };

//------------------------------------------------------------------
void OnStart()
{
  str12 src;
  src.s1.d = -1; // 
  src.s1.l = 20; //
  ArrayInitialize(src.s1.i, 0); 

  // src.s2 - tableau d'octets de s1
}
 
_SERG_:


uchar n'est pas correct d'ailleurs, et double est présent là aussi, de manière suspecte.

Et d'ailleurs src devrait spécifier ce qui lui appartient exactement et sera transmis.

Quelqu'un vous a déjà corrigé comme vous l'avez suggéré. C'est bien. Pensez-y. Bonne chance.

 
Est-ce que cela fonctionnera pour mql4 aujourd'hui ?
 
Seric29:
Est-ce que cela fonctionnera pour mql4 aujourd'hui ?

Les langages (MQL4 / MQL5) sont complètement les mêmes aujourd'hui - la différence réside dans 2-3 fonctions manquantes dans MQL4(ArrayPrint et quelque chose d'autre de petit) et dans les "nouvelles fonctionnalités" de MQL5 - base de données, DirectX et OpenCL.


Mais l'article a été écrit il y a 8 ans, maintenant MQL est devenu un langage strictement typé, et pour assigner 2 structures (exemple dans l'article) vous devez écrire un constructeur de copie ou sérialiser la structure en un tableau d'octets et vice-versa.

 
Votre article m'a beaucoup aidé, mais comment copier l'article n'a pas mentionné un pointeur de fonction, parce que j'ai besoin de mettre le pointeur de la fonction callback passé comme Je ne sais pas comment mettre en œuvre.
 
Example 4. Copying the structures by means of MQL5
struct str1
{
  double d; // 8 octets
  long l;   // 8 octets
  int i[3]; // 3*4=12 octets
};
struct str2
{
  uchar c[8+8+12]; // taille de la structure str1
};
//+------------------------------------------------------------------+
//| Fonction de démarrage du programme de script|
//+------------------------------------------------------------------+
void OnStart()
{
  str1 src; 
  src.d=-1;
  src.l=20;
  //--- remplissage des paramètres de la structure
  ArrayInitialize(src.i, 0); 
  str2 dst;
  //--- transformer la structure en tableau d'octets
  dst=src; 
}

L'affectation de structures de types différents ne fonctionne plus(la conversion deparamètres n'est pas autorisée - une variable du même type est attendue).

Mais il serait possible de travailler avec des unions :

struct str1
{
  double d; // 8 octets
  long l;   // 8 octets
  int i[3]; // 3*4=12 octets
};
struct str2
{
  uchar c[8+8+12]; // taille de la structure str1
};
union union1
{
  str1 src;
  str2 dst;
};

//+------------------------------------------------------------------+
//| Fonction de démarrage du programme de script|
//+------------------------------------------------------------------+
void OnStart()
{
  union1 u; 
  u.src.d=-1;
  u.src.l=20;
  //--- remplissage des paramètres de la structure
  ArrayInitialize(u.src.i, 0); 

  //--- le tableau d'octets représentant la structure se trouve dans dst.c
  ArrayPrint(u.dst.c);
 
Je me demande s'il est possible d'obtenir un vrai pointeur sur une fonction. Les pointeurs obtenus à l'aide de typedef fonctionnent parfaitement dans le programme mql. Mais malheureusement je n'ai pas réussi à les passer à la dll.