"Getting Rid of Self-Made DLLs" makalesi için tartışma - sayfa 2

 

Makalenin yazarı,bisiklet dll'leri olmadan IPC birlikte çalışabilirliği hakkında bu kadar erişilebilir bir bilgi sunumu için çok minnettar.

Bellekle çalışmak bana oldukça karmaşık görünüyor, ancak bazı sorular dışında yaklaşım açık, umarım bilgili insanlar anlamaya yardımcı olur:

1. Memcpy yardımıyla iki baytlık bir short değişkenini uchar[2] dizisine kopyalıyoruz, bilgi dizinin içine nasıl yerleştirilir?

uchar dizisinin 0 ve 1 indeksindeki değerler hangi formatta olacaktır?

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

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

Değer bayt bayt bölünüyor ve diziye yazılıyor, tamam ... Sanırım burayı anladım.

Bu diziye hangi değerlerin düştüğünü ve bunlardan orijinal değeri nasıl alacağımı anlayamıyorum, soru bu değerleri ekranda görüntüleyememem değil.


2. Örneğin memcpy kopyalarken uchar[4] dizisini farklı tipteki değerlerle nasıl düzgün bir şekilde doldurabilirim:

uchar dst[4];
short src1 = 2;
short src2 = 13331;
memcpy(dst, src1, sizeof(src1));
memcpy(dst, src2, sizeof(src2)); // Zaten var olan bir değerin üzerine yazar, yani dst'ye yazarken, adresin src1 yazıldıktan sonra 2 baytlık bir ofset ile belirtilmesi gerektiğini varsayıyorum.

Cevap önemsiz gibi geliyor ve her şey basitçe yapılıyor, ama nasıl doğru bir şekilde yazılır?

 

Print'i denediniz mi?

 

Dördüncü örnek hata verir: 'operator=' - yasadışı işlem kullanımı 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; //   <----- Ошибка

}


Bellek bölümü hakkındaki fikri anlıyorum, ancak belki de tanımlar tam olarak doğru değildir?

Bana sebebinin ne olduğunu söyleyebilir misiniz?

Şimdiden teşekkürler.
 
_SERG_:

Bellek konumu fikri açık, ancak belki de tanımlarda yanlış bir şey var?

Bunun nedeni nedir?

Farklı türlerdeki yapılar artık kopyalanamaz, MQL bu olasılığı kaldırmıştır.

union kullanın

//Örnek 4. MQL5 aracılığıyla yapıların kopyalanması
//---
struct str1
{
  double d; // 8 bayt
  long   l; // 8 bayt
  int i[3]; // 3 * 4 = 12 bayt
};

//---
struct str2
{
  uchar c[ 8 + 8 + 12 ]; // str1 yapı boyutu
};

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 - s1'den gelen bayt dizisi
}
 
_SERG_:


uchar bu arada yanlıştır ve orada double da şüpheli bir şekilde mevcuttur.

Ve bu arada src tam olarak neye ait olduğunu ve geçirileceğini belirtmelidir.

Birisi zaten sizi önerdiğiniz gibi düzeltti. Güzel. Düşün. İyi şanslar.

 
bugün için mql4 için çalışacak mı?
 
Seric29:
bugün mql4 i̇çi̇n çalişacak mi?

Diller (MQL4 / MQL5) şu anda tamamen aynı - fark MQL4'te eksik olan 2-3 işlev(ArrayPrint ve başka küçük bir şey) ve MQL5 için "yeni özellikler" - veritabanı, DirectX ve OpenCL.


ancak makale 8 yıl önce yazıldı, şimdi MQL katı tipli bir dil haline geldi ve 2 yapı atamak için (makaledeki örnek) bir kopya yapıcı yazmanız veya yapıyı bir bayt dizisine serileştirmeniz ve sonra tekrar geri dönmeniz gerekiyor.

 
Makaleniz bana çok yardımcı oldu, ancak makaleyi nasıl kopyalayacağım bir işlev işaretçisinden bahsetmedi, çünkü geri arama işlevi işaretçisini şu şekilde geçirmem gerekiyor Nasıl uygulayacağımı bilmiyorum.
 
Example 4. Copying the structures by means of MQL5
struct str1
{
  double d; // 8 bayt
  long l;   // 8 bayt
  int i[3]; // 3*4=12 bayt
};
struct str2
{
  uchar c[8+8+12]; // str1 yapı boyutu
};
//+------------------------------------------------------------------+
//| Betik program başlatma işlevi|
//+------------------------------------------------------------------+
void OnStart()
{
  str1 src; 
  src.d=-1;
  src.l=20;
  //--- yapı parametrelerinin doldurulması
  ArrayInitialize(src.i, 0); 
  str2 dst;
  //--- yapıyı bayt dizisine dönüştürmek
  dst=src; 
}

Farklı tipteki yapıları atamak artık çalışmıyor(parametre dönüşümüne izin verilmiyor - aynı tipte değişken bekleniyor).

Ancak birlikler ile çalışmak mümkün olabilir:

struct str1
{
  double d; // 8 bayt
  long l;   // 8 bayt
  int i[3]; // 3*4=12 bayt
};
struct str2
{
  uchar c[8+8+12]; // str1 yapı boyutu
};
union union1
{
  str1 src;
  str2 dst;
};

//+------------------------------------------------------------------+
//| Betik program başlatma işlevi|
//+------------------------------------------------------------------+
void OnStart()
{
  union1 u; 
  u.src.d=-1;
  u.src.l=20;
  //--- yapı parametrelerinin doldurulması
  ArrayInitialize(u.src.i, 0); 

  //--- yapıyı temsil eden bayt dizisi dst.c'de bulunmaktadır
  ArrayPrint(u.dst.c);
 
Bir fonksiyona gerçek bir işaretçi almanın mümkün olup olmadığını merak ediyorum. Typedef kullanılarak elde edilen işaretçiler mql programı içinde mükemmel çalışıyor. Ama ne yazık ki onları dll'e aktarmayı başaramadım.