Diskussion zum Artikel "Den Ballast selbstgemachter "dynamischer Programmbibliotheken" loswerden" - Seite 2

 

Der Autor des Artikels ist sehr dankbar für eine solche zugängliche Präsentation von Informationen über IPC-Interoperabilität ohne Fahrrad-DLLs.

Arbeiten mit Speicher scheint mir ziemlich kompliziert, aber der Ansatz ist klar, mit Ausnahme einiger Fragen, ich hoffe, sachkundige Menschen helfen, zu verstehen:

1. Mit Hilfe von memcpy kopieren wir eine Zwei-Byte-Variable short in das Array uchar[2], wie wird die Information in das Array selbst übertragen?

Welches Format haben die Werte bei Index 0 und 1 des uchar-Arrays?

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

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

Der Wert wird byteweise aufgeteilt und in das Array geschrieben, ok ... Ich glaube, ich verstehe das hier.

Ich kann nicht verstehen, welche Werte in dieses Array fallen und wie man den ursprünglichen Wert von ihnen erhält, die Frage ist nicht, dass ich diese Werte nicht auf dem Bildschirm anzeigen kann.


2. Wie füllt man das Array uchar[4] richtig mit Werten unterschiedlichen Typs, wenn man z.B. memcpy kopiert:

uchar dst[4];
short src1 = 2;
short src2 = 13331;
memcpy(dst, src1, sizeof(src1));
memcpy(dst, src2, sizeof(src2)); // Überschreibt einen bereits vorhandenen Wert, d.h. ich gehe davon aus, dass beim Schreiben auf dst die Adresse mit einem Offset von 2 Bytes nach dem Schreiben von src1 angegeben werden muss.

Es fühlt sich an, als wäre die Antwort trivial und alles ist einfach, aber wie schreibt man es richtig auf?

 

Haben SiePrint schon ausprobiert?

 

Das vierte Beispiel gibt Fehler: 'operator=' - illegale 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; //   <----- Ошибка

}


Ich verstehe die Idee mit dem Speicherbereich, aber vielleicht sind die Definitionen nicht ganz richtig?

Können Sie mir sagen, was der Grund dafür ist?

Vielen Dank im Voraus.
 
_SERG_:

Die Idee eines Speicherplatzes ist klar, aber vielleicht ist etwas in den Definitionen falsch?

Was ist der Grund dafür?

Strukturen unterschiedlichen Typs können nicht mehr kopiert werden, MQL hat diese Möglichkeit entfernt.

Union verwenden

//Beispiel 4. Kopieren von Strukturen mit Hilfe von 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 ]; // Größe der Struktur 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 - Byte-Array aus s1
}
 
_SERG_:


uchar ist übrigens falsch, und double ist dort auch verdächtig präsent.

Und übrigens sollte src angeben, was genau dazu gehört und übergeben wird.

Jemand hat Sie bereits korrigiert, so wie Sie es vorgeschlagen haben. Gut so. Denkste. Viel Glück!

 
Wird es für mql4 für heute funktionieren?
 
Seric29:
wird es für MQL4 heute funktionieren?

Die Sprachen (MQL4 / MQL5) sind jetzt völlig gleich - der Unterschied liegt in 2-3 Funktionen, die in MQL4 fehlen(ArrayPrint und etwas anderes Kleines) und in "neuen Features" für MQL5 - Datenbank, DirectX und OpenCL.


aber der Artikel wurde vor 8 Jahren geschrieben, jetzt ist MQL eine streng typisierte Sprache geworden, und um 2 Strukturen zuzuweisen (Beispiel im Artikel) müssen Sie einen Kopierkonstruktor schreiben oder die Struktur in ein Byte-Array serialisieren und dann wieder zurück.

 
Ihr Artikel sehr große Hilfe für mich, aber wie man den Artikel zu kopieren nicht erwähnen, eine Funktion Zeiger, weil ich brauche, um die Callback-Funktion Zeiger als übergeben setzen Ich weiß nicht, wie zu implementieren.
 
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]; // Größe der Struktur str1
};
//+------------------------------------------------------------------+
//| Skript-Programmstartfunktion|
//+------------------------------------------------------------------+
void OnStart()
{
  str1 src; 
  src.d=-1;
  src.l=20;
  //--- Ausfüllen der Strukturparameter
  ArrayInitialize(src.i, 0); 
  str2 dst;
  //--- Umwandlung der Struktur in ein Byte-Array
  dst=src; 
}

Die Zuweisung von Strukturen unterschiedlichen Typs funktioniert nicht mehr(Parameterumwandlung nicht erlaubt - Variable des gleichen Typs erwartet).

Es wäre aber möglich, mit Unions zu arbeiten:

struct str1
{
  double d; // 8 Bytes
  long l;   // 8 Bytes
  int i[3]; // 3*4=12 Bytes
};
struct str2
{
  uchar c[8+8+12]; // Größe der Struktur str1
};
union union1
{
  str1 src;
  str2 dst;
};

//+------------------------------------------------------------------+
//| Skript-Programmstartfunktion|
//+------------------------------------------------------------------+
void OnStart()
{
  union1 u; 
  u.src.d=-1;
  u.src.l=20;
  //--- Ausfüllen der Strukturparameter
  ArrayInitialize(u.src.i, 0); 

  //--- das Byte-Array, das die Struktur darstellt, befindet sich in dst.c
  ArrayPrint(u.dst.c);
 
Ich frage mich, ob es möglich ist, einen echten Zeiger auf eine Funktion zu erhalten. Zeiger, die mit typedef erhalten werden, funktionieren perfekt in mql-Programm. Aber leider ist es mir nicht gelungen, sie an die DLL zu übergeben.