Новый синтаксис MQL4 - страница 5

 
gchrmt4:
Все еще не уверен, что понимаю, но... Я не думаю, что вы можете объявить импорт MQL4 как void*. Вы должны использовать определенный тип данных в импорте, а затем вы можете использовать импорт DLL только с этим типом данных. Если вы хотите использовать одну и ту же функцию DLL с разными типами данных, то у вас возникнут проблемы, если только нет обходного пути, например, https://www.mql5.com/en/forum/148934.


На самом деле я использую обходной путь, но он довольно слабый - обертывание любого типа в общую структуру. Принятие общей структуры в качестве параметра может измениться в любой будущей версии. Однако это не работает с массивами.

 
Ovo:


На самом деле я использую обходной путь, но он довольно слабый - обернуть любой тип в общую структуру. Принятие общей структуры в качестве параметра может измениться в любом будущем выпуске. Это не работает с массивами, однако.

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

#import "AnyDll.dll"
   void Test(TestStruct &[]);
   void Test(int &[]);
#import 
 
gchrmt4:

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


Конечно, это то, о чем я говорю с самого начала :)

Пока что мой импорт выглядит так:

bool ReadFile(int, MT4Structure&, uint, uint&[],int); // wrapper for all simple types / structures
bool ReadFile(int, double&[], uint, uint&[],int);
bool ReadFile(int, int&[], uint, uint&[],int);
bool ReadFile(int, uchar&[], uint, uint&[],int);
bool ReadFile(int, MT4Structure&[], uint, uint&[],int); // this does not work

И мне интересно, насколько длинным станет этот список (для одного импорта) через год...

 

Я также заметил небольшое несоответствие в компиляции кода с зависимостью от включаемых файлов.

Если два или более проекта используют один и тот же включаемый файл, и включаемый файл изменяется, то первый проект обнаруживает это и перекомпилирует, а последующие - нет. Однако это не является серьезной проблемой (мы можем удалить все ex4 в любое время).

 

Мне нужен только быстрый ответ, я устал искать его сегодня. Можно ли уничтожить scope2 до того, как он достигнет границы блока? Я так не думаю, но лучше спросить.

{
   MT4Scope* scope = new MT4Scope(_Symbol, 222);
   MT4Scope scope2(_Symbol, 223);
   delete scope; // calls destructor
   // here I want to call scope2 destructor, but I do not know how

   // some additional code
}
 
Ovo: Мне нужен только быстрый ответ, я устал искать его сегодня. Можно ли уничтожить scope2 до того, как он достигнет границы блока? Я так не думаю, но лучше спросить.
Нет.
 
ubzen:
Нет.


Спасибо.
 

Почему "ArrayMaximum" отличается между MT4 600+ и MT5? Я думал, что причина миграции синтаксиса МТ4 в синтаксис МТ5 была в том, чтобы облегчить разработку приложений, которые работают на обоих!!!?


MT4

int  ArrayMaximum(
   const void&   array[],             // array for search
   int           count=WHOLE_ARRAY,   // number of checked elements
   int           start=0              // index to start checking with
   );


МТ5

int  ArrayMaximum(
   const void&   array[],             // array for search
   int           start=0,             // index to start checking with
   int           count=WHOLE_ARRAY    // number of checked elements
   );
 
dlewisfl:

Почему "ArrayMaximum" отличается между MT4 600+ и MT5? Я думал, что причина миграции синтаксиса МТ4 в синтаксис МТ5 была в том, чтобы облегчить разработку приложений, которые работают на обоих!!!?

Возможно, чтобы попытаться сохранить обратную совместимость...
 
dlewisfl: Почему "ArrayMaximum" отличается между MT4 600+ и MT5? Я думал, что причина миграции синтаксиса МТ4 в синтаксис МТ5 была в том, чтобы облегчить разработку приложений, которые работают на обоих!!!?
Нехорошо. Так что создавайте свои собственные:
int iArrayMaximum(const void& array[], int iLimit=WHOLE_ARRAY, int iBeg=0){
   if(iLimit == WHOLE_ARRAY) iLimit = ArraySize(array);
#ifdef __MQL4__
   return( ArrayMaximum(array, iLimit - iBeg + 1, iBeg) );
#else
   return( ArrayMaximum(array, iBeg, iLimit - iBeg + 1) );
#endif
}
Проблема решена.
Причина обращения: