Erros, bugs, perguntas - página 3011

 
A100:

Porque o 4º parâmetro

Preciso de copiar os 3 primeiros caracteres. Se eu quisesse copiar a cadeia completa (7 caracteres incluindo o final 0), especificaria -1. E se uma parte não puder ser copiada, para que é que preciso deste parâmetro?

Este parâmetro não é para especificar quantos caracteres pretende copiar, como a sub-cordem
, mas para especificar quantos caracteres são passados para a matriz.
ou seja, é uma verificação de segurança rigorosa do tamanho dos dados que estão a ser passados.
Este tamanho irá atribuir automaticamente memória para a matriz dinâmica.

Se quiser copiar três elementos de uma corda, tem de os obter primeiro da corda,
, e depois passá-los para dentro, especificando o tamanho tanto quanto passar.

 
Roman:

Este parâmetro não é para especificar quantos caracteres pretende copiar, como a sub-cordem
, mas para especificar quantos caracteres são passados para a matriz.
ou seja, é uma verificação de segurança rigorosa do tamanho C sobre o tamanho dos dados que estão a ser passados.
Este tamanho irá atribuir automaticamente memória para a matriz dinâmica.

Se precisar de copiar três elementos de uma corda, tem de os obter primeiro da corda,
, e depois tem de os passar, especificando o tamanho, tanto quanto passar.

Quer dizer desta forma?

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

Quero dizer, certo?

Mais um como o tamanho do zero terminal.
StringLen devolve o tamanho sem incluir o zero.

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

Mais um como o tamanho do zero terminal.
StringLen devolve o tamanho sem considerar zero.

Dei um exemplo dos criadores e funciona

Fórum sobre comércio, sistemas automatizados de comércio e testes estratégicos

Bibliotecas: Biblioteca de funções e conversões de hash

Ilyas, 2021.03.04 15:12

A função StringToArray captura o zero de terminação se o comprimento da corda não for especificado (historicamente)

Portanto, na função CryptDecodeA deve usar

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

em vez de

StringToCharArray(InputText,scr);

 
Vitaly Muzichenko:

Dei um exemplo dos criadores e funciona.


A utilização de bibliotecas não estava prevista nesta pergunta )
.

 
Roman:

Mais um como o tamanho do zero terminal.
StringLen devolve o tamanho sem considerar zero.

O StringToCharArray é tão incapaz de recuperar o comprimento da corda de uma corda (especialmente porque não precisa de o calcular em MQL) que é necessária ajuda externa sob a forma de um parâmetro adicional? E porque é que outras funções MQL não têm um"C-check" tão rigoroso?

 
A100:

O StringToCharArray é tão incapaz de extrair o comprimento da corda do tipo de corda (especialmente porque não precisa de ser calculado em MQL) que é necessária ajuda externa sob a forma de um parâmetro adicional? E porque é que outras funções MQL não têm uma verificação tão alegadamente rigorosa?

Isto provavelmente não é uma questão para mim, mas para os criadores.
Mas este parâmetro é utilizado para alocar o tamanho da memória para uma matriz dinâmica.
Por outras palavras, é uma forma conveniente de evitar atribuir a memória para a matriz por si próprio.
Além disso, podemos verificar a exactidão.
O parâmetro de tamanho adicional é uma prática padrão de segurança rigorosa no sistema.
Noutras funções em que o tamanho não é necessário, este parâmetro está ausente.
Normalmente este parâmetro é utilizado quando se trabalha com arrays para atribuir memória.
Isto é o que acontece neste caso.

 
Roman:

Isto provavelmente não é uma questão para mim, mas para os criadores.
Mas este parâmetro é utilizado para atribuir memória para uma matriz dinâmica.
Significa que é conveniente para si não atribuir a memória da matriz por si próprio.
Além disso, vamos obter uma verificação da correcção.

E em que consiste o controlo da correcção? - Suponha que eu, por exemplo, escrevi 0 - um valor deliberadamente incorrecto.

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

E tudo é copiado correctamente e o resultado: 7 - nenhum erro

 
A100:

O que é a verificação da correcção? - Por isso, digamos que a defini para 0, o que é um valor incorrecto conhecido.

E tudo é copiado correctamente. Resultado: 7 - nenhum erro

O truque está na descrição da função ))

count=-1

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

progresso automático ))
o que confunde mais o utilizador.

 
Roman:

Este parâmetro não é para especificar quantos caracteres pretende copiar como uma sub-cordem
mas para especificar quantos caracteres são passados para a matriz.

ajuda não concorda com esta interpretação.

O número de elementos de matriz a copiar. Define o comprimento da cadeia de resultados. O padrão é -1, o que significa que copiará para o fim da matriz, ou para o terminal 0. O terminal 0 também será copiado para a matriz de destino, e o tamanho da matriz dinâmica pode ser aumentado para corresponder ao tamanho da cadeia, se necessário. Se o tamanho da matriz dinâmica for maior que o comprimento da corda, então o tamanho da matriz não será reduzido.

A descrição, é claro, é atas - a corda é referida como uma matriz, matriz como uma corda, confusão

Número de elementos de matriz (cordel) a copiar. Especifica o comprimento do fio resultante (matriz). O padrão é -1, o que significa copiar para o fim da matriz (string), ou cumprir o terminal 0.