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

 
Правильно, если нет очень веской причины, в моем коде только bool, int, double и string. Я бы не стал заморачиваться с -1 в индексах, иначе мне нужно будет приводить каждое целое число, которое приближается к этому индексу.
 
RaptorUK:

uchar - Беззнаковый символ, зачем использовать его для цикла? Это не имеет смысла... используйте int. Вы будете работать с улонгами, это то, чем является новое время даты ... и когда вы набираете текст, не думая об этом, в будущем вы получите предупреждение ... смиритесь с предупреждением или проигнорируйте его. Не надейтесь на лучшее, делайте то, что вы делаете сейчас, учитесь и понимайте.

То, что вы разместили на stackoverflow, имеет смысл для меня, я думаю, это хороший совет.

uchar был просто примером, поскольку мой вопрос был связан с использованием небольших типов переменных. uchar - это 8-битное положительное значение от 0 до 255, поэтому для цикла от 0 до 100 вы могли бы использовать 8-битный uchar вместо 32-битного целого числа, если бы захотели.
 
SDC:
uchar был просто примером, поскольку мой вопрос был связан с использованием небольших типов переменных. uchar - это 1-байтовое положительное значение от 0 до 255, поэтому для цикла от 0 до 100 вы могли бы использовать 1-байтовый uchar.
Да, можно... но зачем? Это будет работать, но почему имеет логический смысл использовать тип переменной, предназначенный для символьных значений, для счетчика цикла?

Если вам нужно сохранить значение, возвращаемое функцией, а функция возвращает uchar, то используйте переменную uchar для сохранения возвращаемого значения... В оригинальном mql4 это не было проблемой, в новом mql4 это станет проблемой.
 

Когда я задавал вопрос, я не знал, зачем мне это нужно, поэтому я и задал вопрос lol...

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

Я думал, что 32-битная ОС может обрабатывать четыре 8-битных значения одновременно, но не знал. Очевидно, нет. Это объясняет, почему 64-битная ОС на самом деле не намного быстрее 32-битной, за исключением того, что она может получить доступ к большему объему оперативной памяти. Я часто задавался этим вопросом.

 

У меня есть вопрос, для которого я не нашел решения.

Как использовать void&? То есть, если мне нужно передать какой-либо указатель в DLL. В справочном файле есть функции, которые используют этот тип void, но если я помещу его куда-нибудь в исходник, то он не скомпилируется. Я пытался использовать шаблон в качестве обходного пути, но шаблон запрещен в операторе #import.

Я справился с конструированием для отдельных типов, но я не могу реализовать передачу указателя массива void& в DLL, если я не укажу явный тип.

int  FileReadArray(
   int    file_handle,               // File handle
   void&  array[],                   // Array to record
   int    start=0,                   // start array position to write
   int    count=WHOLE_ARRAY          // count to read
);
 
 

Есть ли какие-либо ограничения для передачи массива структур в DLL?

Предположим, MT4Structure - это простая структура.

Импортировав kernel32.dll, одиночная структура работает просто отлично:

bool ReadFile(
    /*_In_         HANDLE*/ int hFile,
    /*_Out_        LPVOID*/ MT4Structure& lpBuffer,
    /*_In_         DWORD*/ uint nNumberOfBytesToRead,
    /*_Out_opt_    LPDWORD*/ uint& lpNumberOfBytesRead[],
    /*_Inout_opt_  LPOVERLAPPED*/int lpOverlapped
);

, но я не могу заставить работать массив структур. Компилятор не скомпилирует MT4Structure&[], если передать егов качестве параметра к этому объявлению:

bool ReadFile(int, MT4Structure&[], uint, uint&[],int);
 
Ovo:

Существуют ли какие-либо ограничения на передачу массива структур в DLL?

Я не вижу проблем с чем-то подобным:

struct TestStruct {
   int Integer;
   uchar Byte;
   double Real;
};

#import "ExampleDllWhichReceivesStructureArray.dll"
   void Test(TestStruct &[]);
#import 

Это работает так, как ожидалось (при условии, что вы допускаете различное выравнивание структур по умолчанию в MT4 и DLL).

(BTW, я не уверен, каково сейчас внутреннее представление MQL4 bool, но я бы предпочел объявлять функции Win32 как возвращающие int. Win32-функции возвращают BOOL, а не bool из C++. BOOL - это макрос Windows для 4-байтового целого числа, значение которого равно 1/0, тогда как bool в C++ - это один байт. Если вы скажете MT4 ожидать от функций один байт возвращаемого значения, в то время как на самом деле они возвращают четыре байта, вы можете - хотя это очень маловероятно - получить повреждение стека).

 
Ovo:

Как использовать void&? Я имею в виду, если мне нужно послать какой-либо указатель в DLL.

Я не совсем понимаю, в чем суть вашего вопроса. Например, в документации Win32 API используется void* в значении "здесь принимается любой тип указателя на что угодно; функцию Win32 не волнует, какой у вас блок памяти".

 
gchrmt4:

Я не совсем понимаю, в чем суть вашего вопроса. Например, в документации Win32 API используется void* в значении "здесь принимается указатель на что-либо любого типа; функции Win32 неважно, какой у вас блок памяти".


Именно так. Но, похоже, в MQL4 это не совсем возможно, и использование шаблона не допускается внутри блока #import. Поэтому использование дополнительной структуры в winapi оборачивается ручным обновлением деклараций #import каждый раз, когда требуется новый тип. Что довольно неудобно для меня, так как я планировал управлять импортом в одном месте.
 
Ovo:

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