Erros, bugs, perguntas - página 2579

 
Roman:

Como é que é um fio vazio? Quando o fio vem de uma tomada, em outras variantes embora esteja torto, mas não está vazio.
Não estou a dizer que a sua variante está errada, mas na sua variante utiliza um conjunto de cordel.
No meu caso, é um ponteiro.

A função socket retorna um ponteiro para const wchar_t *
. É por isso que culpo o bug no mql, porque tentei tantas funções C e hardcore +1 ou +2.
Simplesmente não vai funcionar.

Escreva linhas após memcpy() em paralelo ao arquivo, se mql for culpado (há algum invólucro em cima das chamadas com argumentos de cópia), então o arquivo não estará vazio, provavelmente.

HH: bem, só por precaução - a função da biblioteca em µl é declarada com um link, certo? fn(string & s) vazio?
 
Vict:

Escreva linhas após memcpy() em paralelo com o ficheiro, se a culpa for do µl (há algum invólucro em cima das chamadas com argumentos de cópia), o ficheiro não estará vazio, suponho eu.

HH: bem, só no caso de - em µl a função biblioteca é declarada com referência ? fn(string & s) vazio?

Todas as cordas que exibo ou no gráfico no comentário, ou no terminal de impressão, quando a corda chega é imediatamente visível, no comentário pode ver se está torta ou não.
Quando há grandes lapsos de tempo, o cordel raramente aparece no gráfico, e há buracos na impressão.
A dúvida de que nenhuma corda está a entrar da tomada desapareceu, os dados da carraça entram à taxa de milissegundos.
A partir do socket getData() recebeu uma variável ponteiro, a partir da variável ponteiro copio directamente para mql, sem invólucros.
Sim declarado por feng shui ))

#import "ExampleDll.dll"
   void Func(string task, string & out);
#import
Em geral, há um problema com fio de mql. Experimentou e testou muitas variantes.
O fio da tomada vem com terminal nulo, e a função de verificação mais fiável
wcscpy(out, data);
или
wcsncpy(out, data, wcslen(data));  //wcslen(data)+1
mostra o problema em mql.

Em geral, vou usar sizeof(wichar_t*) por agora e ver o comportamento.
Mas provavelmente para estar a salvo de alterações da MQ, vou realmente escrever cordas em arrays.
 
Mas para estar a salvo de alterações da MQ, provavelmente escreverei realmente as cordas em arrays.

Palavras de ouro. É claro que gostaria de usar cordel, mas como não há nenhum padrão que descreva a sua implementação e/ou comportamento de transferência em dll, é puro ub. E assim, resumindo[] e pode passar a matriz em segurança; a única coisa é a sobrecarga da criação e cópia de uma matriz.

PS. Ainda assim, penso que o problema não está em mql, mas no seu código. Todos os testes passaram normalmente, e não há nada de logicamente errado com o cordel, o cordel é um invólucro trivial sobre o wchar_t *, ou melhor, sobre o cordel, que o poderia estragar.

 
Vladimir Simakov:

Boas palavras. É claro que gostaríamos de usar cordel, mas como não há nenhum padrão que descreva a sua implementação e/ou comportamento de transferência em dll, é puro ub. E assim, resumindo[] e pode passar a matriz em segurança; a única coisa é a sobrecarga da criação e cópia de uma matriz.

PS. Ainda assim, penso que o problema não está em mql, mas no seu código. Todos os testes passaram normalmente, e não há nada de logicamente errado com o cordel, o cordel é um invólucro trivial sobre o wchar_t *, ou melhor, sobre o cordel, que o poderia estragar.

Também eu tinha as minhas dúvidas sobre a libertação, não excluo nada como razão possível.
Mas eu converti a string recebida do soquete para códigos ASCII, pode-se ver que a string está correcta.
A seguir vem uma cópia simples,
O mql não aceita correctamente o ponteiro de cordas.

Arquivos anexados:
1.PNG  32 kb
 
Roman:

Todas as linhas que exibo ou no gráfico no comentário, ou no terminal de impressão, quando a linha chega é imediatamente visível no comentário pode ver se está torta ou não.
Quando há grandes atrasos, a linha raramente aparece no gráfico, enquanto que existem buracos na impressão.
A dúvida de que o fio da tomada não está a chegar, os dados da carraça estão a chegar à taxa de milissegundos.
Do socket getData() levado para a variável ponteiro, da variável ponteiro I copio imediatamente para mql, sem invólucros.
Sim declarado por feng shui ))

Em geral, há um problema com fio de mql. Testado e testado muitas variantes.
O fio da tomada vem com terminal nulo, e a função de verificação mais fiável
mostra o problema em mql.

Em geral, vou usar sizeof(wichar_t*) por agora e ver o comportamento.
Mas provavelmente para estar a salvo de alterações da MQ, vou realmente escrever cordas em arrays.

Escrever para o ficheiro - quis dizer no lado dll, se o ficheiro for escrito, mas não entrar no μl, já é um argumento de peso com uma queixa de bug, talvez corrigido.

E há um invólucro sem o seu desejo, MQ esconde código/endereço do mundo exterior, tudo não vai directamente.

 
Vict:

Escrever para ficheiro - quis dizer no lado dll, se escreve para ficheiro, mas não chega ao mql, então já é um argumento forte com alegação de erro, talvez corrigido.

E há um invólucro sem o seu desejo, os MQs escondem código/endereço do mundo exterior, tudo não vai directamente.

Escreveu as cordas recebidas para um ficheiro.
Uma vez que a função tomada devolve um ponteiro a uma corda, um ponteiro à corda é escrito no ficheiro, e depois este ponteiro é copiado para mql.
Utilização da função

wcscpy(out,  data);

O comprimento do cordel resultante é de 164, o mql é atribuído 200.

StringInit(out, 200, 32);

A cadeia copiada recebida em mql é de igual comprimento, contudo existem algumas lacunas na cópia.
Em mql script, enquanto loop é loopado com Sleep(1)

Arquivos anexados:
458.PNG  71 kb
 
E se utilizar a função
wcsncpy(out, data, wcslen(data));
Depois não há lacunas, mas as linhas copiadas não são rectas, há caracteres extra no fim da linha.
Adicionarwcslen(data)+1 nãoajuda.

Resumindo, de todas as páginas que estou a escrever aqui.
mql string não aceita correctamente da dll, copiado ponteiro para a string const wchar_t*
Arquivos anexados:
w6b.PNG  74 kb
qjv2.PNG  73 kb
09i3.PNG  6 kb
 
Roman:

Correcto, atribuo um amortecedor de cordel para fora, e inicializo-o com espaços.
Depois passo esta string(ponteiro) para dll.

Na dll wchar_t* os dados 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 manual de corda 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 o fio como apontador, pelo que o tamanho deve ser passado para o apontador e não para o tipo.

Por vezes faz-se bem - não funciona.

Fazendo-o mal - parece funcionar.

Nesses casos, é necessário fazê-lo correctamente e procurar um erro noutro lugar.

 
Roman:

Escreveu a cadeia resultante em ficheiro.
Uma vez que a função tomada devolve um ponteiro a uma corda, um ponteiro à corda é escrito no ficheiro e depois este ponteiro é copiado para mql.
Utilização da função

O comprimento do cordel resultante é de 164, o mql é atribuído 200.

A cadeia copiada recebida em mql é de igual comprimento, contudo existem algumas lacunas na cópia.
Em mql script, enquanto loop é loopado com Sleep(1)

1. Na MQL é copiado um fio, não um ponteiro.

2. Seleccionou uma cadeia de 200 caracteres em MQL. Depois copiou 164 caracteres para o mesmo. Depois disso, ver o tamanho da linha em MQL. Restou 200.

 
Koldun Zloy:

Por vezes faz-se bem - não funciona.

Fazendo-o mal - parece funcionar.

Nesses casos, é preciso fazer a coisa certa e procurar o erro noutro lugar.

Por isso, para acertar, desisti da memória, e usei wcscpy ou wcsncncpy.
Resultado, poste acima.