Discusión sobre el artículo "Cómo deshacerse del lastre de las DLL caseras" - página 2

 

El autor del artículo está muy agradecido por una presentación tan accesible de la información sobre la interoperabilidad IPC sin dlls bicicleta.

Trabajar con la memoria me parece bastante complicado, pero el enfoque es claro, excepto algunas preguntas, espero que la gente con conocimientos ayudará a entender:

1. Con la ayuda de memcpy copiamos una variable short de dos bytes en el array uchar[2], ¿cómo se introduce la información en el propio array?

¿Qué formato tendrán los valores en los índices 0 y 1 del array uchar?

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

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

El valor se divide byte a byte y se escribe en el array, ok ... Creo que entiendo aquí.

No puedo entender que valores caen en este array y como obtener el valor original de ellos, la cuestión no es que no pueda mostrar estos valores en pantalla.


2. Como llenar correctamente el array uchar[4] con valores de diferentes tipos al copiar memcpy, por ejemplo:

uchar dst[4];
short src1 = 2;
short src2 = 13331;
memcpy(dst, src1, sizeof(src1));
memcpy(dst, src2, sizeof(src2)); // Sobrescribe un valor ya existente, es decir, asumo que al escribir en dst, la dirección debe especificarse con un offset de 2 bytes después de escribir src1.

Parece que la respuesta es trivial y todo se hace simplemente, pero ¿cómo escribirlo correctamente ?

 

¿Ha probadoPrint?

 

El cuarto ejemplo da error : 'operator=' - operación ilegal usar 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; //   <----- Ошибка

}


Entiendo la idea sobre la sección de memoria, pero ¿quizás las definiciones no son del todo correctas?

¿Puedes decirme cuál es la razón?

Gracias de antemano.
 
_SERG_:

La idea de una posición de memoria está clara, pero ¿quizá hay algo mal en las definiciones?

¿Cuál es la razón?

Las estructuras de diferentes tipos ya no se pueden copiar, MQL ha eliminado esta posibilidad.

uso de la unión

//Ejemplo 4. Copia de estructuras mediante MQL5
//---
struct str1
{
  double d; // 8 bytes
  long   l; // 8 bytes
  int i[3]; // 3 * 4 = 12 bytes
};

//---
struct str2
{
  uchar c[ 8 + 8 + 12 ]; // tamaño de la estructura 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 - matriz de bytes de s1
}
 
_SERG_:


uchar es incorrecto por cierto, y hay doble es también sospechosamente presente allí.

Y por cierto src debería especificar que es exactamente lo que le pertenece y será pasado.

Alguien ya te ha corregido tal y como sugeriste. Bien. Piensa. Buena suerte.

 
¿funcionará para mql4 para hoy?
 
Seric29:
¿funcionará para mql4 hoy?

Los lenguajes (MQL4 / MQL5) son completamente iguales ahora - la diferencia está en 2-3 funciones que faltan en MQL4(ArrayPrint y algo más pequeño) y en "nuevas características" para MQL5 - base de datos, DirectX y OpenCL.


pero el artículo fue escrito hace 8 años, ahora MQL se ha convertido en un lenguaje estrictamente tipado, y para asignar 2 estructuras (ejemplo en el artículo) es necesario escribir un constructor de copia o serializar la estructura en una matriz de bytes y luego de vuelta otra vez.

 
Su artículo muy gran ayuda para mí, pero cómo copiar el artículo no mencionó un puntero de función, porque tengo que poner el puntero de la función de devolución de llamada pasado como No se como implementarlo.
 
Example 4. Copying the structures by means of MQL5
struct str1
{
  double d; // 8 bytes
  long l;   // 8 bytes
  int i[3]; // 3*4=12 bytes
};
struct str2
{
  uchar c[8+8+12]; // tamaño de la estructura str1
};
//+------------------------------------------------------------------+
//| Función de inicio del programa de script|
//+------------------------------------------------------------------+
void OnStart()
{
  str1 src; 
  src.d=-1;
  src.l=20;
  //--- rellenar los parámetros de la estructura
  ArrayInitialize(src.i, 0); 
  str2 dst;
  //--- convertir la estructura en la matriz de bytes
  dst=src; 
}

Asignar structs de diferentes tipos ya no funciona( no se permite la conversión de parámetros - se espera una variable del mismo tipo).

Pero sería posible trabajar con uniones:

struct str1
{
  double d; // 8 bytes
  long l;   // 8 bytes
  int i[3]; // 3*4=12 bytes
};
struct str2
{
  uchar c[8+8+12]; // tamaño de la estructura str1
};
union union1
{
  str1 src;
  str2 dst;
};

//+------------------------------------------------------------------+
//| Función de inicio del programa de script|
//+------------------------------------------------------------------+
void OnStart()
{
  union1 u; 
  u.src.d=-1;
  u.src.l=20;
  //--- rellenar los parámetros de la estructura
  ArrayInitialize(u.src.i, 0); 

  //--- la matriz de bytes que representa la estructura está en dst.c
  ArrayPrint(u.dst.c);
 
Me pregunto si es posible obtener un puntero real a una función. Los punteros obtenidos usando typedef funcionan perfectamente bien dentro del programa mql. Pero desgraciadamente no he conseguido pasarlos a la dll.