Объявление структур в MQL4 - страница 2

 

да и вообще приведения типов не хватает, как и нормальной поддержки напримера типа void. В результате нельзя передать в функцию нетипизированный массив. С одной стороный из-за неявного приведения типов все равно какой передавать, а с другой - нельзя, компилятор не кушает. Продемонстрирую примером:

string function glue_double( double& arr[]){
  string str="";
  for(int i=ArraySize(arr)) - 1; i >= 0; i-- )
     str = str + arr[i]
  return(str);
}
string function glue_int( int& arr[]){
  string str="";
  for(int i=ArraySize(arr)) - 1; i >= 0; i-- )
     str = str + arr[i]
  return(str);
}

Приходится делать так, нельзя вместо этого одну функцию заделать.

 
Itso:

Можно так:

double MуStructure.price;
datetime MуStructure.time;

Это что ШУТКА?
static double struct.price; //компилируется

static double struct.price //НЕ компилируется, скобку выплевывает.
{ int i;
double j;
};

Может быть struct.price нужно определять в *.h? Поясните пожалуйста неторопясь.

 
Структур в MQL4 нет. Поэтому Ваше объявление структуры компилятор воспрнимает как объявление переменной с пропущенным ";"
static double struct.price //НЕ компилируется, скобку выплевывает.
и следующий за ним составной оператор
{ int i;
double j;
};
 
Integer писал(а) >>
Например в функцию GetWindowRect из user32.dll надо передавать структуру типа RECT, которая состояит из 4-ех интов: Left, Top, Right. Bottom. Вместо стркутры можно использовать массив инт из 4-ех элементов. Есть структуры, которые состоят не только из int, еще из double, bool и string. В этом случае тоже только один вариант - использовать один массив из интов, а вот потом рассчитать значение каждой переменной используя этот массив.

Можно попробовать тупо передать набор переменных

например вместо

Struct MуStructure {
double price;
long int time;
};

MуStructure MуStructure1;

MуStructure1.price=3.62;

MуStructure1.time=....;

и затем объявления вызова

int dllproc (MуStructure);

объявить функцию из dll как

int dllproc (double price, long int time);

иногда проходит.

Зависит от того, как упакованы данные в структуре. И не передается ли она вообще по ссылке ;)

 

Хмм, интересная тема. А что если...


объявляем так:

#import "..."

void fillStruct(int &i[]);


void func()
{

int i;

double d;

char a[16];


fillStruct(i);

}


Так вот, если переменные хранятся в одной памяти и они не выровнены, то может прокатить. В dll эта функция будет объявлена как void fillStruct(MyStruct *s)....

Пробовать лень, если кто проверит, пишите результат...

 
Можно что-то типа такого организовать чтобы имитировать структуры и как их брать из Dll. Но структуры и классы планируют добавить в новой версии языка, которая вообще-то не за горами.
#define DblField 0
#define IntField 1
#define TimeField 2
#define FieldCnt 3

double StructArray[];



int StructCnt = GetStructCntFromDll();
ArrayResize(StructArray, FieldCnt * StructCnt);
GetStructsFromDll(StructArray);
for(int s = 0; s < StructCnt; s++)  {
    double DblFieldVal = StructArray[s * FieldCnt + DblField];
    //Что-нибудь делаем с полем дабл DblFieldVal
    double IntFieldVal = StructArray[s * FieldCnt + IntField];
    //Что-нибудь делаем с полем int IntFieldVal
    datetime TimeFieldVal = StructArray[s * FieldCnt + TimeField];
    //Что-нибудь делаем с полем datetime TimeFieldVal
}
//Удаление элемента из массива структур с индексом Ind
if(StructCnt > 1 && Ind < StructCnt - 1)
    ArrayCopy(StructArray, StructArray, FieldCnt * Ind,  FieldCnt * (Ind + 1), (StructCnt - Ind - 1) * FieldCnt);