A nova sintaxe MQL4 - página 4

 
Correto, não há uma razão muito boa, apenas bool, int, double e string estão em meu código. Eu não me preocuparia com -1 em índices, caso contrário precisaria lançar cada inteiro que se aproxima deste índice.
 
RaptorUK:

uchar - Unsigned Character, why would you use this for a loop ? it doesn't make sense to me . . . use an int. Você estará trabalhando com ulongs, isso é o que é uma nova data, . . e quando você digita sem pensar nisso no futuro você será avisado . . lidar com o aviso ou ignorá-lo. Mas não espere apenas pelo melhor, faça como está fazendo agora, aprenda e compreenda

O que você postou do stackoverflow faz sentido para mim, eu acho que é um bom conselho.

uchar foi apenas um exemplo, pois minha pergunta estava relacionada ao uso de pequenos tipos de variáveis. uchar é um valor positivo de 8 bits de 0 a 255, portanto, para um loop de 0 a 100 você poderia usar o uchar de 8 bits em vez de um inteiro de 32 bits, se quisesse.
 
SDC:
uchar foi apenas um exemplo, pois minha pergunta estava relacionada ao uso de pequenos tipos de variáveis. uchar é um valor positivo de 1 byte de 0 a 255, portanto, para um loop de 0 a 100 você poderia usar o uchar de 1 byte.
Sim, você poderia . . . mas por que você faria isso ? funcionará, mas por que faz sentido lógico usar um tipo de variável destinada a valores de caracteres para um contador de loop ?

Se você precisar salvar um valor retornado de uma função e a função em questão retornar um uchar, então use uma variável uchar para salvar o valor retornado . . com o mql4 original isto não foi um problema, será mais um problema com o novo mql4.
 

Quando fiz a pergunta, não sabia por que quereria fazer isso, foi por isso que fiz a pergunta rs...

Eu não sabia se um tipo de variável de 8 bits processaria mais rápido que um 32 bits ou se seria mais lento ou apenas o mesmo, eu não sabia se um valor de 8 bits usaria menos memória RAM ou menos espaço em disco. como agora temos esses pequenos tipos de variáveis disponíveis, eu só estava interessado em saber os prós e os contras de usá-los quando eles se encaixassem nos requisitos do bloco de código, em vez de apenas ficar com inteiros de 32 bits em toda a linha.

Pensei que talvez um sistema operacional de 32 bits pudesse processar quatro valores de 8 bits ao mesmo tempo, mas eu não sabia. Aparentemente, não sabia. Isto explica porque um sistema operacional de 64 bits não é realmente muito mais rápido que um de 32 bits, exceto pelo fato de que ele pode acessar mais RAM. Eu tinha me perguntado com freqüência sobre isso.

 

Tenho uma pergunta, para a qual não encontrei solução.

Como usar o vazio&? Quero dizer, se eu precisar enviar algum ponteiro para uma DLL. No arquivo de ajuda existem funções, que utilizam este tipo de vazio, mas se eu o colocar em qualquer lugar na fonte, ele não será compilado. Eu tentei usar o modelo como uma alternativa, mas o modelo é proibido dentro da declaração #importar.

Eu gerenciei a construção para tipos únicos, mas não sou capaz de implementar ponteiro de passagem de void& array para a DLL, a menos que eu especifique o tipo explícito.

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
);
 
 

Há alguma limitação para passar uma série de estruturas para uma DLL?

Suponha que o MT4Structure seja uma estrutura simples.

Tendo importado o kernel32.dll, uma única estrutura funciona muito bem:

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

mas não sou capaz de entrar no trabalho aceitando o conjunto de estruturas. O compilador não compilará com o MT4Structure&[] se enviado como parâmetro para esta declaração:

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

Há alguma limitação para passar uma série de estruturas para uma DLL?

Não vejo nenhum problema com algo assim:

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

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

Funciona como esperado (desde que você permita diferentes alinhamentos de estrutura padrão no MT4 e na DLL).

(BTW, na verdade não tenho certeza de qual é a representação interna de um bool MQL4 agora, mas prefiro declarar as funções Win32 como retornando int. As funções Win32 retornam um BOOL em vez de um C++ bool. Uma BOOL é uma macro do Windows para um inteiro de 4 bytes, cujo valor é 1/0, enquanto uma BOOL C++ é um byte único. Se você disser ao MT4 para esperar um único byte de valor de retorno das funções quando elas estão realmente retornando quatro bytes, então você pode - embora seja muito improvável - acabar com a corrupção da pilha).

 
Ovo:

Como usar o vazio&? Se eu precisar enviar algum ponteiro para uma DLL.

Não tenho bem a certeza de qual é sua pergunta. Por exemplo, a documentação da API Win32 usa void* para significar "isto aceita qualquer tipo de ponteiro para qualquer coisa; a função Win32 não se importa com o que é seu bloco de memória".

 
gchrmt4:

Não estou bem certo de qual é sua pergunta. Por exemplo, a documentação da API Win32 usa void* para significar "isto aceita qualquer tipo de ponteiro para qualquer coisa; a função Win32 não se importa com o que é seu bloco de memória".


Exatamente. Mas parece não ser bem possível com a MQL4, e o uso de um modelo não é permitido dentro do bloco #importante. Assim, o uso de uma estrutura adicional com winapi se transforma em uma atualização manual das declarações # de importação toda vez que um novo tipo é necessário. O que é bastante desconfortável para mim, já que minha intenção era administrar as importações em um só lugar.
 
Ovo:

Exatamente. Mas parece não ser bem possível com a MQL4, e o uso de um modelo não é permitido dentro do bloco #importante. Assim, o uso de uma estrutura adicional com winapi se transforma em uma atualização manual das declarações # de importação toda vez que um novo tipo é necessário. O que é bastante desconfortável para mim.
Ainda não tenho certeza se entendi, mas... Não creio que você possa declarar a importação MQL4 como nula*. Você tem que usar um tipo de dado específico na importação, e então você só pode usar a importação DLL com esse tipo de dado. Se você quiser usar a mesma função DLL com diferentes tipos de dados, então você tem um problema, a menos que haja uma solução como https://www.mql5.com/en/forum/148934.
Razão: