Errori, bug, domande - pagina 2576

 
Vict:

I tuoi esempi sono divertenti, hai rimosso tutto, hai lasciato UB (modifica letterale della stringa), e tutti devono telepatizzare. Se vi aspettate di ricevere qualche consiglio intelligente, date un minimo di codice funzionante (su due lati), altrimenti è solo spazzatura.

L'esempio mostra il luogo che causa il problema, cioè il problema è nella copia del puntatore wchar_t* alla stringa mql.
Il resto del codice non è rilevante per il problema e non è utile, perché controlla solo se ci sono dati, poi legge, ecc.
Perché scriverlo nell'esempio e contaminare l'essenza del problema, quando anche con un codice semplificato, molte persone non capiranno qual è il problema.
Per capirci,getData() è una funzione di rete che legge FrameOpcode, e restituisce i dati ricevuti come puntatore a una stringa di tipo const wchar_t *.

Tutti sanno che una semplice funzionewcscpy(out, data) copiaconst wchar_t * stringa nellastringawchar_t *, e conta automaticamente la lunghezza dei caratteri per terminare const wchar_t * nullo.
Qui incontriamo un errore, mql string non accetta correttamente una stringacopiatawchar_t *, quindi perché? Se la funzione rileva automaticamente il null del terminale.
Nell'articolo di Renat, le stringhe sono copiate tramite memcpy con errore di dimensione del byte. Forse lo stesso approccio è usato nel codice del terminale stesso, per formare stringhe di tipo mql.
Vedete,
memcpy non solo non è adatto a copiare stringhe, ma anche con l'errore di dimensione dei byte passati, risulta in dati non uniformi.
Ci sono altre funzioni C speciali per la copia delle stringhe, comewcscpy, wcsncpy, ecc.
E Renat stesso ha scritto in uno dei thread che presto sarà completamente rielaborato lavorando con le stringhe, apparentemente il problema è noto, ma per qualche motivo silenzio in risposta al problema che ho indicato.

Ecco un confronto tra la dimensione in byte del puntatorewchar_t* e il semplice tipowchar_t

File:
1.PNG  83 kb
 
Roman:

Naturalmente, è più facile scrivere tutto un casino in risposta che un normale test riproducibile sostituendo getData() con qualcosa. Cosa vi aspettate se UB su UB e le conclusioni sono sbagliate:

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

Tutto è proprio lì. C'è qualcosa di sbagliato nelle vostre idee sulle stringhe, da cui lo sprawl.

 
Vict:

Naturalmente, è più facile scrivere tutto un casino in risposta che un normale test riproducibile sostituendo getData() con qualcosa. Cosa vi aspettate se UB su UB e le conclusioni sono sbagliate:

Tutto è proprio lì. C'è qualcosa di sbagliato nelle vostre nozioni di stringhe, da cui gli errori.

Non c'è modo di fornire codice riproducibile, dato che voi stessi capite che si tratta di una dll che utilizza librerie di terze parti.
Ecco perché ho pensato che ci fosse un errore nell'esempio.
memcpy(cp,to,wcslen(to)*sizeof(wchar_t));//questa stringa deve contenereil puntatore sizeof(wchar_t *)

Se usiamo la funzione senza il puntatore,

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

farà sì che la fine della stringa sia sommersa da caratteri inutili. Guarda la fine della stringa nell'immagine.
Ed è logico che se copiamo una stringa wchar_t * come puntatore, dovremmo passare la dimensione del puntatore e non quella del tipo.

E se usiamo un puntatore,

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

la stringa è chiara e senza caratteri extra.
Non avrebbe importanza, ma in entrambi i casi ho ulteriori problemi con il parsing, cioè ottengo errori o omissioni nelle stringhe.

E se uso questa funzione, allora non trapela nulla, tutto il parsing è buono, solo un carattere extra alla fine delle interruzioni di riga, poi appare e poi scompare.

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

Quindi sto passando attraverso un mucchio di opzioni, dove può essere la causa, ma usando memcpy senza il puntatore al sizeof, il risultato può essere visto nello screenshot.

Voglio controllare la stringa wchar_t * ricevuta per terminale null, se è lì o no.
Come si può fare?

File:
 
Usare una funzione senza puntatore,

lascia fuori senza \0 alla fine.

E se uso un puntatore

qui sei fuori dai limiti

E se uso questa funzione, allora non trapela nulla, tutto viene analizzato bene, solo un carattere extra alla fine della stringa, appare e scompare.

di nuovo fuori senza \0. Vedere i documenti

wcsncpy, wcsncpy_s

...

Se il conteggio viene raggiunto prima che l'intera stringa src sia stata copiata, l'ampia matrice di caratteri risultante non è a terminazione nulla.

...

HH: forse non si scherza affatto con le stringhe? salvare gli array in wchar_t ed eseguirli, e dentro µl convertire in stringa se necessario https://www.mql5.com/ru/docs/convert/shortarraytostring

 
Vict:

ZS: forse non si scherza affatto con le stringhe? salvare gli array in wchar_t ed eseguirli, e all'interno del µl convertire in stringa se necessario

Oh, grazie )), per il suggerimento che wcsncpy taglia lo zero.
Sì, gli array sono lasciati per ultimi, se i puntatori non funzionano, userò gli array.

 

Il motore del forum non permette di fare un post da una singola immagine. Richiede l'inserimento di un testo.

Devi mettere uno spazio.

 
fxsaber:

Il motore del forum non permette di fare un post da una singola immagine. Richiede l'inserimento di un testo.

Devo mettere uno spazio.

Sembra avere senso: questo è un forum e la cosa principale è il testo. Un'immagine allegata a quanto alla volta. Questo non è un cimitero di immagini.

 

Ho completato il codice, funziona in MT4/5, ma ho una piccola sorpresa

Come posso sostituireTesterStop() in MQL4

?

 
Igor Makanu:

Come posso sostituire TesterStop() in MQL4?

EspertoRimuovi.

 
fxsaber:

EspertoRimuovi.

Conosco questa variante, ma ho visto rapporti che ExpertRemove(0) non può essere usato per gli Expert Advisors nel mercato.

In generale, uso TesterStop() in due casi:

- invece di INIT_PARAMETERS_INCORRECT per nascondere il log dell'ottimizzatore

- se non ci sono abbastanza fondi per aprire un ordine, non lo apro, ma chiudo il test per ottimizzarlo più velocemente