Errori, bug, domande - pagina 3011

 
A100:

Perché il quarto parametro

Ho bisogno di copiare i primi 3 caratteri. Se volessi copiare l'intera stringa (7 caratteri compreso lo 0 finale), specificherei -1. E se alcuni di essi non possono essere copiati, a cosa mi serve questo parametro?

Questo parametro non serve a specificare quanti caratteri volete copiare, come la sottostringa
, ma a specificare quanti caratteri vengono passati all'array.
cioè è un controllo di sicurezza rigoroso in stile C sulla dimensione dei dati che vengono passati.
Questa dimensione alloca automaticamente la memoria per l'array dinamico.

Se volete copiare tre elementi da una stringa, dovete prima prenderli dalla stringa,
, e poi passarli, specificando le dimensioni man mano che li passate.

 
Roman:

Questo parametro non serve a specificare quanti caratteri volete copiare, come la sottostringa
, ma a specificare quanti caratteri vengono passati all'array.
cioè è un controllo di sicurezza rigoroso della dimensione dei dati che vengono passati.
Questa dimensione alloca automaticamente la memoria per l'array dinamico.

Se avete bisogno di copiare tre elementi da una stringa, dovete prima prenderli dalla stringa,
, e poi dovete passarli dentro, specificando la dimensione man mano che passate.

Vuoi dire come questo?

StringToCharArray(InputText,scr,0,StringLen(InputText));
 
Vitaly Muzichenko:

Voglio dire, giusto?

Più uno come dimensione dello zero finale.
StringLen restituisce la dimensione senza includere lo zero.

char ch[];
string InputText = "ABCDEF";
int    size      =  StringLen(InputText)+1;
    
StringToCharArray( InputText, ch, 0, size);
Print(GetLastError()); //0
 
Roman:

Più uno come dimensione dello zero finale.
StringLen restituisce la dimensione senza considerare lo zero.

Ho dato un esempio dagli sviluppatori e funziona

Forum sul trading, sistemi di trading automatico e test di strategia

Librerie: libreria di funzioni hash e conversioni

Ilyas, 2021.03.04 15:12

La funzione StringToArray cattura lo zero finale se la lunghezza della stringa non è specificata (storicamente)

Pertanto, nella funzione CryptDecodeA si dovrebbe usare

StringToCharArray(InputText,scr,0,StringLen(InputText));

invece di

StringToCharArray(InputText,scr);

 
Vitaly Muzichenko:

Ho dato un esempio dagli sviluppatori e funziona.


L'uso delle biblioteche non era inteso in questa domanda ))
Queste sono le sfumature delle biblioteche.

 
Roman:

Più uno come dimensione dello zero finale.
StringLen restituisce la dimensione senza considerare lo zero.

StringToCharArray è così incapace di recuperare la lunghezza della stringa da una stringa (soprattutto perché non è necessario calcolarla in MQL) che è necessario un aiuto esterno sotto forma di un parametro aggiuntivo? E perché altre funzioni MQL non hanno questo presunto"controllo C" rigoroso?

 
A100:

StringToCharArray è così incapace di estrarre la lunghezza della stringa dal tipo di stringa (soprattutto perché non deve essere calcolata in MQL) che è necessario un aiuto esterno sotto forma di un parametro aggiuntivo? E perché altre funzioni MQL non hanno un tale presunto controllo rigoroso?

Questa probabilmente non è una domanda per me, ma per gli sviluppatori.
Ma questo parametro è usato per allocare la dimensione della memoria per un array dinamico.
In altre parole, è un modo conveniente per evitare di allocare la memoria per l'array da soli.
Inoltre, possiamo controllare la correttezza.
Il parametro di dimensione supplementare è una pratica standard di sicurezza rigorosa nel sys.
In altre funzioni in cui la dimensione non è richiesta, questo parametro è assente.
Di solito questo parametro viene usato quando si lavora con gli array per allocare la memoria.
Questo è quello che succede in questo caso.

 
Roman:

Questa probabilmente non è una domanda per me, ma per gli sviluppatori.
Ma questo parametro è usato per allocare la memoria per un array dinamico.
Significa che è conveniente per voi non allocare la memoria dell'array da soli.
In più avremo un controllo di correttezza.

E in cosa consiste il controllo di correttezza? - Supponiamo che io, per esempio, abbia scritto 0 - un valore deliberatamente sbagliato.

void OnStart()
{
    uchar ch[];
    const string text = "ABCDEF";
    Print( StringToCharArray( text, ch, 0, 0 ));
}

E tutto viene copiato correttamente e il risultato: 7 - nessun errore

 
A100:

Qual è il controllo di correttezza? - Quindi, diciamo che l'ho impostato a 0, che è un valore errato noto.

E tutto viene copiato correttamente. Risultato: 7 - nessun errore

Il trucco è nella descrizione della funzione ))

count=-1

[in]  Количество элементов массива для копирования. Определяет длину результатной строки. 
По умолчанию -1, что означает копирование до конца массива, либо до встречи терминального 0. 
Терминальный 0 также будет скопирован в массив-приемник, при этом размер динамического массива может быть увеличен при необходимости под размер строки. 
Если размер динамического массива больше длины строки, то размер массива уменьшен не будет. 

progresso automatico ))
che confonde di più l'utente.

 
Roman:

Questo parametro non serve a specificare quanti caratteri volete copiare come sottostringa
ma a specificare quanti caratteri vengono passati all'array.

help non è d'accordo con questa interpretazione.

Il numero di elementi dell'array da copiare. Definisce la lunghezza della stringa del risultato. Il valore predefinito è -1, il che significa che copierà alla fine dell'array, o il terminale 0. Anche il terminale 0 sarà copiato nell'array di destinazione, e la dimensione dell'array dinamico può essere aumentata per corrispondere alla dimensione della stringa, se necessario. Se la dimensione dell'array dinamico è maggiore della lunghezza della stringa, allora la dimensione dell'array non verrà ridotta.

La descrizione, naturalmente, è atas - la stringa è indicata come un array, l'array come una stringa, confusione

Numero di elementi dell'array (stringa) da copiare. Specifica la lunghezza della stringa (array) risultante. Il valore predefinito è -1, che significa copiare alla fine dell'array (stringa), o incontrare il terminale 0.