Errori, bug, domande - pagina 2579

 
Roman:

Come può essere una stringa vuota? Quando la stringa viene da una presa, in altre varianti anche se è storta, non è vuota.
Non sto dicendo che la tua variante è sbagliata, ma nella tua variante usi un array di stringhe.
Nel mio caso è un puntatore.

La funzione socket restituisce un puntatore a const wchar_t *
Ecco perché do la colpa del bug a mql, perché ho provato così tante funzioni C e l'hardcore +1 o +2.
Semplicemente non funziona.

Scrivere le righe dopo memcpy() in parallelo al file, se mql è colpevole (c'è qualche wrapper sopra le chiamate con argomenti di copia), allora il file non sarà vuoto, probabilmente.

HH: bene, solo nel caso - in µl la funzione di libreria è dichiarata con un link, giusto? void fn(string & s)?
 
Vict:

Scrivere le righe dopo memcpy() in parallelo al file, se µl è da biasimare (c'è qualche wrapper sopra le chiamate con argomenti di copia), il file non sarà vuoto, credo.

HH: bene, solo nel caso - in µl la funzione di libreria è dichiarata con riferimento? void fn(string & s)?

Tutte le stringhe le mostro o sul grafico nel commento, o nel terminale di stampa, quando la stringa arriva è immediatamente visibile, nel commento si può vedere se è storta o no.
Quando ci sono grandi perdite di tempo, la stringa appare raramente sul grafico, e ci sono dei buchi nella stampa.
Il dubbio che non arrivi nessuna stringa dal socket è sparito, i dati di tick arrivano a ritmo di millisecondi.
Da socket getData() ha preso in una variabile puntatore, dalla variabile puntatore copio direttamente a mql, senza wrapper.
Sì dichiarato dal feng shui ))

#import "ExampleDll.dll"
   void Func(string task, string & out);
#import
In generale, c'è un problema con la stringa mql. Provato e testato molte varianti.
La stringa dal socket arriva con terminale nullo, e la funzione di controllo più affidabile
wcscpy(out, data);
или
wcsncpy(out, data, wcslen(data));  //wcslen(data)+1
mostra il problema su mql.

In generale, userò sizeof(wichar_t*) per ora e vedrò il comportamento.
Ma probabilmente per essere al sicuro dai cambiamenti di MQ, scriverò davvero stringhe su array.
 
Ma credo che per essere al sicuro dai cambiamenti di MQ, probabilmente scriverò davvero le stringhe su array.

Buon punto. Certo, mi piacerebbe usare le stringhe, ma dato che non c'è uno standard che ne descrive l'implementazione e/o il comportamento di trasferimento in dll, è puro ub. E così, stringa in short[] e potete tranquillamente passare l'array; l'unica cosa è l'overhead di creare e copiare un array.

PS. Tuttavia, penso che il problema non sia in mql, ma nel tuo codice. Tutti i test sono passati normalmente, e non c'è niente di logicamente sbagliato con la stringa, la stringa è un banale wrapper su wchar_t *, o meglio su wstring, che potrebbe rovinare tutto.

 
Vladimir Simakov:

Buone parole. Naturalmente, ci piacerebbe usare le stringhe, ma dato che non esiste uno standard che ne descriva l'implementazione e/o il comportamento di trasferimento in dll, è puro ub. E così, stringa in short[] e potete tranquillamente passare l'array; l'unica cosa è l'overhead di creare e copiare un array.

PS. Tuttavia, penso che il problema non sia in mql, ma nel tuo codice. Tutti i test sono passati normalmente, e non c'è niente di logicamente sbagliato con la stringa, la stringa è un banale wrapper su wchar_t *, o meglio su wstring, che potrebbe rovinare tutto.

Anch'io ho avuto i miei dubbi sul lib, non escludo nulla come possibile motivo.
Ma ho convertito la stringa ricevuta dal socket in codici ASCII, si può vedere che la stringa è corretta.
Poi viene una semplice copia,
mql non accetta correttamente il puntatore alla stringa.

File:
1.PNG  32 kb
 
Roman:

Tutte le linee che visualizzo o sul grafico nel commento, o nel terminale di stampa, quando la linea arriva è immediatamente visibile nel commento mostra che è storta o no.
Quando ci sono grandi ritardi temporali, la linea appare raramente sul grafico, mentre ci sono dei buchi nella stampa.
Il dubbio che la stringa dal socket non arrivi, i dati del tick arrivano a ritmo di millisecondi.
Da socket getData() ha preso a puntatore variabile, da puntatore variabile copio immediatamente a mql, nessun wrapper.
Sì dichiarato dal feng shui ))

In generale, c'è un problema con la stringa mql. Provato e testato molte varianti.
La stringa dal socket arriva con terminale nullo, e la funzione di controllo più affidabile
mostra il problema su mql.

In generale, userò sizeof(wichar_t*) per ora e vedrò il comportamento.
Ma probabilmente per essere al sicuro dai cambiamenti di MQ, scriverò davvero stringhe su array.

Scrivere sul file - intendevo dal lato della dll, se il file viene scritto, ma non entra nel μl, è già un argomento di peso con un reclamo di bug, forse corretto.

E c'è un wrapper senza il tuo desiderio, MQ nasconde il codice/indirizzi dal mondo esterno, tutto non va direttamente.

 
Vict:

Scrivere su file - intendevo dal lato della dll, se scrive su file, ma non arriva a mql, allora è già un argomento forte con reclamo di bug, forse corretto.

E c'è un involucro senza il tuo desiderio, gli MQ nascondono il codice/indirizzi dal mondo esterno, tutto non va direttamente.

Scrive le stringhe ricevute in un file.
Poiché la funzione socket restituisce un puntatore a una stringa, un puntatore alla stringa viene scritto nel file, e poi questo puntatore viene copiato in mql.
Usando la funzione

wcscpy(out,  data);

La lunghezza della stringa risultante è 164, il mql è allocato 200.

StringInit(out, 200, 32);

La stringa copiata ricevuta in mql è di lunghezza uguale, tuttavia, ci sono alcune lacune nella copia.
Nello script mql, il ciclo while viene eseguito con Sleep(1)

File:
458.PNG  71 kb
 
E se usate la funzione
wcsncpy(out, data, wcslen(data));
Allora non ci sono spazi vuoti, ma le linee copiate non sono dritte, ci sono caratteri extra alla fine della linea.
Aggiungerewcslen(data)+1 nonaiuta.

In conclusione, tra tutte le pagine che sto scrivendo qui.
mql stringa non accetta correttamente da dll, copiato puntatore alla stringa const wchar_t*
File:
w6b.PNG  74 kb
qjv2.PNG  73 kb
09i3.PNG  6 kb
 
Roman:

Corretto, alloco un buffer per la stringa in uscita e lo inizializzo con degli spazi.
Poi passo questa stringa (puntatore) a dll.

In dll wchar_t* i dati sono copiati in out, cioè è anche un puntatore. Logicamente non dovrebbero esserci problemi.
Da quanto ho capito dall'aiuto, la funzione StringInit dovrebbe impostare la lunghezza della stringa.
Ma ho ancora qualche problema conla funzione StringInit stessa; ho specificato la lunghezza della stringa ed è diventato strano quando ho indicato la dimensione del puntatore.
Non capisco quale trasferimento manuale della lunghezza delle corde intendi.

E se usate sizeof(wchar_t) senza un puntatore, la stringa inizia a fluttuare con caratteri extra, il che causa problemi di parsing e perdite.
Per passare stringhe nel dll ho usato l'esempio di Renat, dal suo articolo su come scrivere un dll.
Ma per qualche motivo, se lo passo senza puntatore sizeof(wchar_t), la stringa galleggia, mentre con il puntatore sizeof(wchar_t*) non c'è nessun problema.
Mi sembra logico, sto copiando una stringa come puntatore, la dimensione dovrebbe essere passata al puntatore, non il tipo.

A volte lo fai bene - non funziona.

Facendo male - sembra funzionare.

In questi casi, bisogna fare le cose per bene e cercare un errore altrove.

 
Roman:

Scrive la stringa risultante nel file.
Poiché la funzione socket restituisce un puntatore a una stringa, un puntatore alla stringa viene scritto nel file e poi questo puntatore viene copiato in mql.
Usando la funzione

La lunghezza della stringa risultante è 164, il mql è allocato 200.

La stringa copiata ricevuta in mql è di lunghezza uguale, tuttavia, ci sono alcune lacune nella copia.
Nello script mql, il ciclo while viene eseguito con Sleep(1)

1. In MQL viene copiata una stringa, non un puntatore.

2. Avete selezionato una stringa di 200 caratteri in MQL. Poi ci hai copiato 164 caratteri. Dopo di che, guarda la dimensione della linea in MQL. È rimasto 200.

 
Koldun Zloy:

A volte lo fai bene - non funziona.

Facendo male - sembra funzionare.

In questi casi, bisogna fare la cosa giusta e cercare l'errore altrove.

Quindi, per farlo bene, ho rinunciato a memcpy e ho usato wcscpy o wcsncpy.
Risultato, post sopra.