Erros, bugs, perguntas - página 2577

 
Igor Makanu:

Eu conheço essa opção.

Depois divisão por zero.

 
fxsaber:

Depois divisão por zero.

Ng....havia esperança, mas como sempre apenas hardcore ))))

 
Vict:

ZS: talvez não mexer em cordas? salvar arrays em wchar_t e correr com eles, e dentro do µl converter em cordas se necessário https://www.mql5.com/ru/docs/convert/shortarraytostring

Acordado

Fórum sobre comércio, sistemas automatizados de comércio e testes estratégicos

WinAPI -> MQL5 x64

A100, 2018.05.29 14:11

Toda a regra já foi dita. Se quiser que funcione sempre - precisa de usar o ushort, e se quiser compreender porque é que o string deixa subitamente de funcionar (o que funcionou ontem) - pode usar o string

 
Vict:

aqui está a sair dos limites


Deu-me a ideia de verificar o comprimento da corda inicializada em StringInit(out, 165, 32);

A ajuda do StringInit diz que o segundo parâmetro é o comprimento da corda, o comprimento da corda no meu entendimento é o número de caracteres da corda.
No meu caso, a cadeia de entrada tem 164 caracteres, por isso coloquei 165 no segundo parâmetro, e tentei mais de *2, 330.

Usandomemcpy_s com um ponteiro,

memcpy_s(out, wcslen(data) * sizeof(wchar_t*), data, wcslen(data) * sizeof(wchar_t*));

O resultado foi o mesmo, o fim da corda sempre se desvia pelo número de caracteres, e há fugas quando se analisa.
Sem um ponteiro, a corda também flutua.

Mas deu-me uma ideia e em StringInit(out, 1400, 32) defini o tamanho do ponteiro em bytes, não o comprimento da corda.
E voilá milagre, a corda tornou-se sem caracteres de saída extra, sem problemas de análise, e sem uma única fuga.
Quero notar que é com o ponteiro em tamanho de, sem o ponteiro o fio flutua.

Isto levanta uma questão aos criadores, a ajuda no StringInit é correcta ????
Não está misturado, na ajuda ou na própria função StringInit, o comprimento da corda com o tamanho da corda?
Em geral agora, se usar memcpy, funciona correctamente se passar o tamanho do ponteiro e StringInit é inicializado com este tamanho, não com o comprimento!

 
A100:

Acordado

Sim, eu também concordo. Mas nem sempre é conveniente usar a corda como uma matriz, especialmente quando esta precisa de ser passada através de várias funções.
Os apontadores são mais convenientes neste caso, não é necessário voltar a preencher esta matriz em cada função de trânsito e, além disso, introduzir mais um parâmetro para a matriz, o seu tamanho.

 
A100:

Assim, simplesmente atribuiu um buffer que é deliberadamente sobredimensionado (empurrou para trás o limite) e o erro simplesmente não aparece - porque estava no limite

Também pensei assim, o comprimento do cordel é de 164, conjunto 165, conjunto 330.
330 não é claramente um limite de comprimento de cordas, se contarmos as cordas em caracteres.
Acontece que não é o comprimento, mas o tamanho dos bytes.
Mas a ajuda sugere o oposto, que deveria ser o comprimento emStringInit.

Em geral, como entendi, o tipo de corda do mql é um ponteiro e deve-se manusear este tipo como um ponteiro.

 
Também decidiu verificar a string recebida na dll, para a presença do terminal nulo.
O zero está presente
for (int index = 0; index <= wcslen(data); ++index)
   wcout << static_cast<int>(data[index]) << " ";
123 34 101 34 58 34 97 103 103 84 114 97 100 101 34 44 34 69 34 58 49 53 54 57 54 50 52 50 50 57 50 51 54 44 34 115 34 58 34 66 84 
67 85 83 68 84 34 44 34 97 34 58 49 54 54 50 49 57 49 55 53 44 34 112 34 58 34 56 50 48 50 46 49 48 48 48 48 48 48 48 34 44 34 113 
34 58 34 48 46 48 51 51 50 51 48 48 48 34 44 34 102 34 58 49 56 51 57 54 49 54 55 50 44 34 108 34 58 49 56 51 57 54 49 54 55 50 44 
34 84 34 58 49 53 54 57 54 50 52 50 50 57 50 51 49 44 34 109 34 58 116 114 117 101 44 34 77 34 58 116 114 117 101 125 0
 
Roman:

Se insiste, que seja à sua maneira.

 
Roman:

Também pensei assim. O comprimento do cordel era de 164, eu fixei-o em 165 e depois em 330.
330 não é obviamente um limite de comprimento de corda se contarmos as cordas em caracteres.
Acontece que não é o comprimento, mas o tamanho dos bytes.
Mas a ajuda sugere o oposto, que deveria ser o comprimento em StringInit.

Em geral, como eu entendi, o tipo de corda do mql é um ponteiro e deve-se lidar com este tipo como um ponteiro.

A corda do tipo mql é uma estrutura que contém um ponteiro, o comprimento da corda e possivelmente outra coisa qualquer.

Quando se passa um fio à DLL, apenas o ponteiro é passado. O comprimento da corda deve ser passado manualmente.

E certifique-se sempre de não sobredimensionar a corda.

Todas as alterações no tamanho das cordas estão apenas no lado do MQL.

No lado da DLL, deve ler atentamente a ajuda para as funções que utiliza. Este é o único problema que tem.

sizeof( wchar_t* ) devolve o tamanho do ponteiro. Não é nada disso que precisa.

 
Koldun Zloy:

A corda do tipo mql é uma estrutura que contém um ponteiro, o comprimento da corda e possivelmente outra coisa qualquer.

Quando se passa um fio à DLL, apenas o ponteiro é passado. O comprimento da corda deve ser passado manualmente.

E certifique-se sempre de não sobredimensionar a corda.

Todas as alterações no tamanho das cordas estão apenas no lado do MQL.

No lado da DLL, deve ler atentamente a ajuda para as funções que utiliza. Este é o único problema que tem.

sizeof( wchar_t* ) devolve o tamanho do ponteiro. Isto não é de todo o que precisa.

Certo, atribuo um amortecedor para o cordão, e inicializo-o com espaços.
Depois passo esta string (ponteiro) para dll.

string out;
StringInit(out, 1400, 32);

Func(out);

Em dll, os dados wchar_t* são copiados para fora, ou seja, também um ponteiro. Logicamente, não deverá haver problemas.
Tal como o entendo de acordo com a ajuda, a função StringInit deve definir o comprimento da corda.
Mas ainda tenho alguns problemas com a própriafunção StringInit; especifiquei o comprimento da corda e fiquei esquisito quando apontei para o tamanho do ponteiro.
Não percebo a que comprimento de corda manual se refere.

E se usar sizeof(wchar_t) sem um ponteiro, a corda começa a flutuar com caracteres extra, o que causa problemas com a análise e vazamento.
Para passar as cordas para dll usei o exemplo de Renat, do seu artigo sobre como escrever uma dll.
Mas por alguma razão, se eu o passar sem ponteiro sizeof(wchar_t), o fio flutua, enquanto com o ponteiro sizeof(wchar_t*) não há problema.
Parece-me lógico, estou a copiar um fio como apontador, o tamanho deve ser passado para o apontador e não para o tipo.

Razão: