Преобразование структуры одного вида в другой. На что ругается компилятор?

 

Здравствуйте.

Требуется передать структуру в самописную dll.

Раньше использовал такой прием: делал нужную мне структуру, затем делал другую структуру, в которой был байтовый массив. И преобразовывал одну к другой.
Но сейчас компилятор ругается на операцию присвоения.

'=' - illegal operation use

В чем может быть ошибка и как исправить?


Пример кода:

struct transaction_t
{
   int type; // 4
};

struct transaction_ref_t{
    uchar ref[4];
};

void OnStart()
{
    transaction_t trans;
    transaction_ref_t ref;
    ref = trans;
}

 
neosapient:

Здравствуйте.

Требуется передать структуру в самописную dll.

Раньше использовал такой прием: делал нужную мне структуру, затем делал другую структуру, в которой был байтовый массив. И преобразовывал одну к другой.
Но сейчас компилятор ругается на операцию присвоения.

В чем может быть ошибка и как исправить?


Пример кода:

struct transaction_t
{
   int type; // 4
};

struct transaction_ref_t{
    uchar ref[4];
};

void OnStart()
{
    transaction_t trans;
    transaction_ref_t ref;
    ref = trans;
}

эту возможность убрали и ввели union, смотрите тут и тут
 
Konstantin:
эту возможность убрали и ввели union, смотрите тут и тут

Вау, а когда union ввели, я и не знал? Ни хрена анонсов новых версий нет, раньше ведь делали.
 

В локальной справке читаем

Приведение данных типа простых структур

Данные типа простых структур можно присваивать друг другу только в том случае, если все члены обеих структур имеют числовые типы. При этом в операции присваивания оба операнда, и слева и справа, должны быть типа структур. Как такового почленного приведения не производится, производится простое копирование. Если размеры структур отличаются, то копируется количество байт, соответствующее меньшему размеру. Таким образом компенсируется отсутствие объединений (union) в языке MQL5.

 

Для того чтобы передать структуру в DLL, нет необходимости преобразовывать её в массив.

struct MyStruct
{
  int a;
  int b;
  int c;
};

#import "MyDLL.dll"
  void func( MyStruct& s );
#import

void OnStart()
{
  MyStruct struct1;
  struct1.a = 1;
  struct1.b = 2;
  struct1.c = 3;

  func( struct1 );
}
 
Koldun Zloy:

Для того чтобы передать структуру в DLL, нет необходимости преобразовывать её в массив.


Гениально и просто.
 
Koldun Zloy:

Для того чтобы передать структуру в DLL, нет необходимости преобразовывать её в массив.

только если в mql и длл одинаковое выравнивание
 
Ну DLL ведь самописная. Можно сделать выравнивание какое хочешь.
 

Всем спасибо за ответ.

В итоге переделал так:

struct  transaction_t
{
   int type; // 4
};
union transaction_union_t {
transaction_t tran;
uchar ref[4];
};

void OnStart()
  {
//---
   transaction_t trans;
   transaction_union_t uni;
   uni.tran = trans;
  }

 
neosapient:

Всем спасибо за ответ.

В итоге переделал так:

struct  transaction_t
{
   int type; // 4
};
union transaction_union_t {
transaction_t tran;
uchar ref[4];
};

void OnStart()
  {
//---
   transaction_t trans;
   transaction_union_t uni;
   uni.tran = trans;
  }


Зачем тут union, если  можно просто передать структуру?