Aggiunto StringLen al test, e inizializzato la stringa in modo diverso. La documentazione dice una cosa, il comportamento reale è diverso. E il buffer in questo caso mostra 0 invece di 260.
La documentazione specifica quando viene restituito 0 ed è appropriato per il caso specificato
La documentazione non corrisponde affatto al comportamento attuale!
Documentazione: un valore di 0 significa che la stringa è una costante e il contenuto del buffer non può essere cambiato.
La stringa è inizializzata con una costante "_" e il compilatore considera la stringa condizionatamente (per scopi di efficienza) una costante - perché no? Perché c'è una contraddizione? Tanto più che non vengono eseguite altre operazioni con esso.
Penso di averlo ottenuto con il numero 260, il compilatore stesso alloca la dimensione iniziale del bufferStringBufferLen a 260. Se la lunghezza della stringa è inferiore a 260, StringBufferLen stamperà 260, non la lunghezza effettiva della stringa! E se la lunghezza della stringa è maggiore di 260, allora viene stampato il valore reale della stringa.
Quindi, usando la funzione StringBufferLen, con una lunghezza di stringa inferiore a 260 caratteri, non otterremo la lunghezza reale della stringa, e otterremo sempre 260. Questo deve essere un errore. Non appena la lunghezza supera i 260 caratteri, otterremo la lunghezza reale della stringa.
p.s. poiché la documentazione non è aggiornata è molto fuorviante.
Cioè, usando la funzione StringBufferLen, con una lunghezza di stringa inferiore a 260 caratteri, non otterremo la lunghezza effettiva della stringa, e otterremo sempre 260. Questo deve essere un errore. Non appena la lunghezza supera i 260 caratteri, otterremo la lunghezza reale.
Lunghezza della stringa in senso stretto: StringLen e lunghezza del buffer: StringBufferLen sono funzioni piuttosto rare. E in generale possono non coincidere.
Questo fa due casi almeno discutibili:
voidOnStart()
{
string s1 = "_";
Print(StringBufferLen(s1)); //(1)//Ожидалось 260 вместо 0 - строка s1 далее может быть увеличенаStringInit(s1,1,'_');
conststring s2 = s1;
Print(StringBufferLen(s2)); //(2)//Ожидалось 0\1 вместо 260 - строка s2 константная и не может быть далее увеличена
}
Il bug di ottimizzazione del tester di strategia non è stato ancora risolto.
Si prega di correggere.
L'impostazione di ottimizzazione che uso è balance + sharp ratio, ma viene visualizzato un valore di ottimizzazione anomalo come nello screenshot, e l'ottimizzazione normale dovuta a questo valore anomalo viene generata nella successiva generazione di ottimizzazione. È impossibile.
L'ottimizzazione che sto usando è balance + sharp, ma il valore di ottimizzazione anormale è mostrato come nello screenshot e l'ottimizzazione normale dovuta a questo valore anormale è generata nella successiva generazione di ottimizzazione. Questo non è possibile
La dimensione della memoria di stringa preallocata è una questione interna del compilatore e non ci si può fare affidamento.
I risultati dell'esecuzione mostrano che il compilatore agisce contro la logica:
Per una stringa costante viene allocata più memoria del necessario (la sua lunghezza non può essere aumentata in linea di principio)
Per una stringa non costante, non viene allocata ulteriore memoria (se la sua lunghezza viene aumentata, sarà necessaria una nuova allocazione di memoria)
Se un utente inizializza una stringa con StringInitInit, viene allocata più memoria del necessario, perché la dimensione del buffer è impostata esplicitamente dall'utente e nella maggior parte dei casi non sarà aumentata (l'utente ha già pensato a quale buffer finale ha bisogno e ha impostato la sua dimensione esplicitamente)
I risultati dell'esecuzione mostrano che il compilatore agisce contro la logica:
Per una stringa costante viene allocata più memoria del necessario (la sua lunghezza non può essere aumentata in linea di principio)
Per una stringa non costante, non viene allocata ulteriore memoria (se la sua lunghezza viene aumentata, sarà necessaria una nuova allocazione di memoria).
Se un utente inizializza una stringa con StringInitInit, viene allocata più memoria del necessario, perché la dimensione del buffer è definita esplicitamente dall'utente, e nella maggior parte dei casi, non sarà aumentata (l'utente ha già pensato a quale buffer finale ha bisogno e definito la sua dimensione esplicitamente)
La dimensione di preallocazione dei buffer per le stringhe è una questione interna del compilatore.
Cambieremo la gestione delle stringhe molte altre volte.
Consenti l'uso dei cookie per accedere al sito MQL5.com.
Abilita le impostazioni necessarie nel browser, altrimenti non sarà possibile accedere.
Hai effettuato l'accesso. L'autenticazione a due fattori è stata disattivata. Configurala di nuovo e scansiona un nuovo codice QR, oppure continua con l'autenticazione a due fattori disattivata.
Aggiunto StringLen al test, e inizializzato la stringa in modo diverso. La documentazione dice una cosa, il comportamento reale è diverso.
E il buffer in questo caso mostra 0 invece di 260.
La documentazione specifica quando viene restituito 0 ed è appropriato per il caso specificato
La documentazione indica quando viene restituito 0 ed è appropriato per il caso indicato
La documentazione non corrisponde affatto al comportamento attuale!
E i risultati sono diversi ))Qual è la differenza tra i due tipi di inizializzazione?
E non è chiaro da dove venga il numero 260 di sinistra.
La documentazione non corrisponde affatto al comportamento attuale!
Documentazione: un valore di 0 significa che la stringa è una costante e il contenuto del buffer non può essere cambiato.
La stringa è inizializzata con una costante "_" e il compilatore considera la stringa condizionatamente (per scopi di efficienza) una costante - perché no? Perché c'è una contraddizione? Tanto più che non vengono eseguite altre operazioni con esso.
E in generale non è chiaro da dove venga il numero 260 di sinistra.
Il moderatore ha spiegato da dove viene, e perché nel caso di
non appare - motivo per controllare
Il moderatore ha chiarito da dove
Penso di averlo ottenuto con il numero 260, il compilatore stesso alloca la dimensione iniziale del bufferStringBufferLen a 260.
Se la lunghezza della stringa è inferiore a 260, StringBufferLen stamperà 260, non la lunghezza effettiva della stringa!
E se la lunghezza della stringa è maggiore di 260, allora viene stampato il valore reale della stringa.
Quindi, usando la funzione StringBufferLen, con una lunghezza di stringa inferiore a 260 caratteri, non otterremo la lunghezza reale della stringa, e otterremo sempre 260.
Questo deve essere un errore.
Non appena la lunghezza supera i 260 caratteri, otterremo la lunghezza reale della stringa.
p.s. poiché la documentazione non è aggiornata è molto fuorviante.
Cioè, usando la funzione StringBufferLen, con una lunghezza di stringa inferiore a 260 caratteri, non otterremo la lunghezza effettiva della stringa, e otterremo sempre 260.
Questo deve essere un errore.
Non appena la lunghezza supera i 260 caratteri, otterremo la lunghezza reale.
Lunghezza della stringa in senso stretto: StringLen e lunghezza del buffer: StringBufferLen sono funzioni piuttosto rare. E in generale possono non coincidere.
Questo fa due casi almeno discutibili:
I risultati dell'esecuzione mostrano che il compilatore agisce contro la logica:
I risultati dell'esecuzione mostrano che il compilatore agisce contro la logica:
La dimensione di preallocazione dei buffer per le stringhe è una questione interna del compilatore.
Cambieremo la gestione delle stringhe molte altre volte.