Erros, bugs, perguntas - página 2576

 
Vict:

Os seus exemplos são engraçados, removeu tudo, deixou a UB (modificação literal da corda), e todos têm de se telepatizar. Se espera obter alguns conselhos inteligentes, dê um código de trabalho mínimo (em dois lados), caso contrário é apenas lixo.

O exemplo mostra o local que causa o problema, ou seja, o problema está na cópia do apontador wchar_t* para um fio mql.
O resto do código não é relevante para o problema e não é útil, porque apenas verifica se existem dados, depois lê, etc.
Porquê escrevê-lo no exemplo e contaminar a essência do problema, quando mesmo com um código simplificado, muitas pessoas não compreenderão qual é o problema.
Compreender,getData() é uma função de rede que lê FrameOpcode, e devolve os dados recebidos como um ponteiro a uma string do tipo const wchar_t *.

Todos sabem que uma simples funçãowcscpy(out, data) copiaconst wchar_t * string paraa stringwchar_t *, e conta automaticamente o comprimento dos caracteres para o terminal null const wchar_t *.
Aqui encontramos um erro, a string mql não aceita correctamente uma stringcopiadawchar_t *, então porquê? Se a função detectar automaticamente o terminal nulo.
No artigo de Renat, as cordas são copiadas através de memcpy com erro de tamanho de byte. Talvez a mesma abordagem seja utilizada no próprio código terminal, para formar uma cadeia do tipo mql-.
Como vê,
a memória não só não é adequada para copiar cadeias de caracteres, mas também com erro de tamanho de bytes passados, resulta em dados irregulares.
Existem outras funções especiais C para a cópia de cordas, tais comowcscpy, wcsncncpy, etc.
E o próprio Renat escreveu num dos fios que em breve serão completamente retrabalhados trabalhando com cordas, aparentemente o problema é conhecido, mas por alguma razão o silêncio em resposta ao problema que indiquei.

Aqui está uma comparação do tamanho do byte do ponteirowchar_t* e do tipowchar_t simples

Arquivos anexados:
1.PNG  83 kb
 
Roman:

Claro que é mais fácil escrever uma bagunça inteira em resposta do que um teste reprodutível normal, substituindo getData() por algo. O que se espera se a UB na UB e as conclusões estiverem erradas:

memcpy(cp,to,wcslen(to)*sizeof(wchar_t));  //в этой строке должен быть указатель sizeof(wchar_t *)

está tudo aí mesmo. Algo está errado com as suas ideias sobre cordas, daí a dispersão.

 
Vict:

Claro que é mais fácil escrever uma bagunça inteira em resposta do que um teste reprodutível normal, substituindo getData() por algo. O que se espera se a UB na UB e as conclusões estiverem erradas:

está tudo aí mesmo. Algo está errado com as suas noções de cordas, daí os erros.

Não há forma de fornecer código reprodutível, uma vez que você próprio compreende que se trata de um dll que utiliza bibliotecas de terceiros.
Quanto à razão pela qual pensei que havia um erro no exemplo.
memcpy(cp,to,wcslen(to)*sizeof(wchar_t));//esta corda deve contero tamanho do ponteiroof(wchar_t *)

Se utilizarmos a função sem o ponteiro,

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

fará com que o fim da corda seja inundado com caracteres desnecessários. Veja o fim da corda na imagem.
E é lógico que se copiarmos um wchar_t * como ponteiro, devemos passar o tamanho do ponteiro e não o tamanho do tipo.

E se usarmos um ponteiro,

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

a corda é clara e sem caracteres extra.
Não importa, mas em ambos os casos tenho mais problemas com a análise, ou seja, fios a vazar e a saltar.

E se eu usar esta função, então nada vaza, toda a análise é boa, apenas um carácter extra no fim da linha quebra, depois aparece e depois desaparece.

wcsncpy(out, data, wcslen(data));

Assim, estou a passar por um monte de opções, mas utilizando memórias sem um ponteiro do tamanho de um, o resultado é mostrado na imagem do ecrã.

Quero verificar se o wchar_t * string recebido é nulo, quer esteja lá ou não.
Como é que isto pode ser feito?

Arquivos anexados:
 
Utilização de uma função sem ponteiro,

deixa de fora sem \0 no final.

E se eu usar um ponteiro,

aqui está fora dos limites

E se eu usar esta função, então nada vaza, tudo é analisado, apenas um carácter extra no fim da corda, aparece e desaparece.

sem o \0. Ver documentos

wcsncncpy, wcsncpy_s

...

Se os países atingidos antes de toda a cadeia de caracteres ter sido copiada, a vasta gama de caracteres resultante não é nula.

...

HH: talvez não mexer em cordas? guardar arrays em wchar_t e executá-los, e dentro de µl converter em cordas se necessário https://www.mql5.com/ru/docs/convert/shortarraytostring

 
Vict:

ZS: talvez não mexer em cordas? guardar arrays em wchar_t e executá-los, e dentro do µl converter em cordas, se necessário

Oh, obrigado ), pela dica de que o wcsncncpy corta o zero.
Sim, as arrays são deixadas para o fim, se as indicações não funcionarem, usarei arrays.

 

O motor do fórum não lhe permite fazer uma mensagem a partir de uma única imagem. Exige a introdução de texto.

É preciso colocar um espaço.

 
fxsaber:

O motor do fórum não lhe permite fazer uma mensagem a partir de uma única imagem. Exige a introdução de texto.

Tenho de colocar um espaço.

Parece fazer sentido: este é um fórum e o principal é o texto. Uma fotografia anexada a quanto de cada vez. Isto não é um cemitério de imagens.

 

Terminei o código, funciona em MT4/5, mas enfrentei uma pequena surpresa

Como posso substituirTesterStop() em MQL4

?

 
Igor Makanu:

Como posso substituir TesterStop() em MQL4?

ExpertRemove.

 
fxsaber:

ExpertRemove.

Conheço esta variante, mas vi relatórios que a ExpertRemove(0) não pode ser utilizada para Expert Advisors in the Market.

Em geral, utilizo TesterStop() em dois casos:

- em vez de INIT_PARAMETERS_INCORRECT para esconder o registo do optimizador

- se não há fundos suficientes para abrir uma encomenda, não a abro, mas fecho o teste para a optimizar mais rapidamente