Errori, bug, domande - pagina 2461

 
fxsaber:

Potrebbe approfondire questo punto?

Di seguito è la mia opinione soggettiva, se mi sbaglio da qualche parte, sarei felice di aiutare.


StringLen funzionava O(n) fino al primo carattere NULL (0x0000) nella stringa, ora funziona O(1).
Lalunghezza delle stringhe poteva sempre essere troncata tramite StringSetCharacter(str, pos, 0x00), ma hanno introdotto StringSetLength per qualche motivo.

Molto probabilmente, l'analizzatore ha risolto il compito di accelerare il codice quando si lavora con le stringhe.
Il compito di velocizzare il codice è stato risolto e a nessuno importa che metà della funzione ora gestisce i caratteri NULL nella stringa e l'altra metà no.

#define  PRINT(x) Print(#x, ":", string(x))

void OnStart(){  
   string str = "123456789";
   PRINT(str);
   PRINT(StringLen(str));
   
   PRINT(StringSetCharacter(str, 7, 0x00));
   PRINT(StringLen(str));
   
   str += "\x00" + str;
   PRINT(StringLen(str));
   
   str += str;
   PRINT(str);
   PRINT(StringLen(str));
   
   ushort array[];
   PRINT(StringToShortArray(str, array));
   ArrayPrint(array);
   
   PRINT(StringLen(str));
   PRINT(StringLen(ShortArrayToString(array)));
   PRINT(StringLen(ShortArrayToString(array, 0, StringLen(str))));
} 

Il risultato:

2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      str:123456789
2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      StringLen(str):9
2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      StringSetCharacter(str,7,0x00):true
2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      StringLen(str):7
2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      StringLen(str):15
2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      str:1234567
2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      StringLen(str):30
2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      StringToShortArray(str,array):31
2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      49 50 51 52 53 54 55  0 49 50 51 52 53 54 55 49 50 51 52 53 54 55  0 49 50 51 52 53 54 55  0
2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      StringLen(str):30
2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      StringLen(ShortArrayToString(array)):7
2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      StringLen(ShortArrayToString(array,0,StringLen(str))):7
 
Sergey Dzyublik:

Di seguito è la mia opinione soggettiva, se mi sbaglio da qualche parte, sarei felice di aiutare.


StringLen lavorava O(n) fino al primo carattere NULL (0x0000) nella stringa, ma ora funziona O(1).
Lalunghezza delle stringhe poteva sempre essere troncata tramite StringSetCharacter(str, pos, 0x00), ma hanno introdotto StringSetLength per qualche motivo.

Molto probabilmente, l'analizzatore ha risolto il compito di accelerare il codice quando si lavora con le stringhe.
Il compito di velocizzare il codice è stato risolto e a nessuno importa che metà della funzione ora gestisce i caratteri NULL nella stringa e l'altra metà no.


Il risultato:

Per favore, trattenete le vostre emozioni.
La prossima volta che usi un linguaggio scurrile, dovrai essere bandito - non siamo in un pub. E non è più di moda imprecare in un pub.
 
Sergey Dzyublik:

StringLen lavorava O(n) fino al primo carattere NULL (0x0000) nella stringa, ora funziona O(1)

Solo bug parzialmente risolti ... perché no!? Nella mia memoria StringLen ha sempre funzionato correttamente (almeno in x32)
 
Sergey Dzyublik:
Agli sviluppatori:
Si prega di aggiungere la possibilità di specificare la generazione forzata di codice per l'operatore di assegnazione predefinito (costruttore di copia):

È un po' complicato. È più facile usare l'analogia con il costruttore di default:

1) qualsiasi operatore di assegnazione sovrascrive l'operatore di assegnazione predefinito

2) qualsiasi operatore di copia sovrascrive l'operatore di copia predefinito

 
A100:
Solo errori parzialmente corretti ... perché no!?

Poiché MQL non ha un'idea coerente quando si tratta di stringhe con caratteri NULL, questo è il problema.
Per esempio, StringToShortArray supporta i caratteri NULL in una stringa mentre la funzione inversa ShortArrayToString non lo fa...

Di conseguenza, si spende più tempo a catturare i bug e a cercare soluzioni piuttosto che a risolvere compiti particolari.

 
A100:

È un po' complicato. È più facile usare l'analogia con il costruttore di default:

1) qualsiasi operatore di assegnazione sovrascrive l'operatore di assegnazione predefinito

2) qualsiasi operatore di copia annulla l'operatore di copia predefinito

Non ho bisogno di annullare; ho bisogno, al contrario, di una generazione forzata.
MQL non ha funzionalità per la copia profonda di tipi complessi, e nell'operatore di assegnazione e nel costruttore di copia sono implementati di default.

 
Sergey Dzyublik:

Poiché non c'è un'idea coerente in MQL quando si tratta di stringhe con caratteri NULL, questo è il problema.
Per esempio, StringToShortArray supporta i caratteri NULL in una stringa, mentre la sua funzione inversa ShortArrayToString non lo fa...

Da un lato sì, dall'altro è esplicitamente dichiarato nella Documentazione: "o fino a quando il terminale 0 è soddisfatto".

 
Sergey Dzyublik:
Beh, non è chiaro perché le linee zero dei plus siano state trascinate in primo luogo.
 
A100:

Da un lato sì, dall'altro è esplicitamente dichiarato nella Documentazione(che non lo fa)

EStringToShortArray dice la stessa cosa:

 Количество элементов массива для копирования. Определяет длину результатной строки. По умолчанию -1, что означает копирование до конца массива, либо до встречи терминального 0.

Tuttavia, questo non gli impedisce di gestire adeguatamente i caratteri NULL nella stringa.

 
Salve. La versione mobile di MT5 non si connette al mio broker Alpari. Qual è il problema? Questo sarà risolto ad un certo punto?