エラー、バグ、質問 - ページ 3011

 
A100:

なぜなら、第4パラメータ

最初の3文字をコピーしたいのですが。もし、文字列全体(末尾の0を含む7文字)をコピーしたい場合は、-1を指定します。また、一部がコピーできない場合、このパラメーターは何のために必要なのでしょうか?

このパラメータは、
サブストリングのようにコピーする文字数を指定するのではなく、配列に渡す文字数を指定します。
つまり、渡されるデータのサイズに対するC言語的な厳密なセキュリティチェックが行われているのです。
このサイズでダイナミックアレイ用の メモリが自動的に確保されます。

文字列から3つの要素をコピーしたい場合、まず文字列から
、渡す分だけサイズを指定して渡さなければなりません。

 
Roman:

このパラメータは,
サブストリングのようにコピーする文字数を指定するのではなく,配列に渡す文字数を指定します.
すなわち,渡されるデータのサイズに対してCサイズの厳密なセキュリティチェックを行うものです.
このサイズでダイナミックアレイ用の メモリが自動的に確保されます。

文字列から3つの要素をコピーする必要がある場合、まず文字列から
。そして、渡す分だけサイズを指定して渡さなければならない。

こんな感じか?

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

つまり、そうでしょ?

終端ゼロのサイズとしてプラス1。
StringLenは、ゼロを含まないサイズを返します。

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

終端ゼロのサイズとしてプラス1。
StringLenは、0を無視したサイズを返す。

開発者の例をあげましたが、うまくいきました

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

ライブラリ: ハッシュ関数と変換のライブラリ

イリヤス さん 2021.03.04 15:12

StringToArray関数は、文字列の長さが指定されていない場合、終端ゼロをキャプチャする(歴史的)

したがって、 CryptDecodeA 関数では

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

代わりに

StringToCharArray(InputText,scr);

 
Vitaly Muzichenko:

開発者の例を出したが、うまくいった。


この質問では、ライブラリの利用は 意図していませんでした ))
これは、ライブラリのニュアンスです。

 
Roman:

終端ゼロのサイズとしてプラス1。
StringLenは、0を無視したサイズを返す。

StringToCharArrayは、文字列から文字列長を取得することができないため(特にMQLで計算する必要がないため)、追加パラメータという形で外部の助けが必要なのでしょうか?また、他のMQL関数には、なぜこのような厳密な「C-check」がないのでしょうか?

 
A100:

StringToCharArrayは、文字列型から文字列長を抽出することができないため(特にMQLで計算する必要がないため)、追加パラメータという形で外部の助けが必要なのでしょうか?また、他のMQL関数には、なぜこのような厳密なチェックがないと言われているのでしょうか?

これは私への質問ではなく、開発者の方への質問でしょう。
しかし、このパラメータは動的配列の メモリサイズを割り当てるために使用されます。
つまり、自分で配列のメモリを確保する必要がない便利な方法なのです。
さらに、正しさを確認することもできます。
追加のサイズパラメータは、sys.NETの厳格なセキュリティの標準的なプラクティスです。
サイズを必要としない他の関数では、このパラメータは存在しない。
通常、このパラメータは配列を扱う際にメモリを確保するために使用されます。
この場合、こうなるのです。

 
Roman:

これは私への質問ではなく、開発者の方への質問でしょう。
しかし、このパラメータは動的配列に メモリを割り当てるために使用されます。
つまり、自分で配列のメモリを確保しなくて済むので便利ということです。
さらに、正しさのチェックを受けることができるのです。

また、check for correctnessとは何でしょうか?- 例えば、私が意図的に間違った値である「0」を書いたとする。

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

そして、すべてが正しくコピーされ、結果:7 - エラーなし

 
A100:

正しさのチェックはどうなっているのでしょうか?- そこで、不正確な値であることが分かっている「0」に設定したとします。

そして、すべてが正しくコピーされています。 結果:7 - エラーなし

コツは関数の説明にあります ))

count=-1

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

automatic progress ))
、ユーザーをより混乱させることになります。

 
Roman:

このパラメータは、サブストリングとしてコピーする文字数
を指定するのではなく、配列に渡す文字数を指定するためのものです。

は、この解釈に異を唱えた。

コピーする配列の要素数。結果文字列の長さを定義する。デフォルトは -1 で,配列の末尾,つまり端末 0 までコピーします.端末 0 もコピー先の配列にコピーされ,必要なら動的配列のサイズを文字列サイズに合わせて大きくすることができます.動的配列のサイズが文字列の長さより大きい場合、配列のサイズは縮小 されない。

もちろん、記述はアタシ。文字列を配列、配列を文字列と呼んで混乱する

コピーする配列(文字列)の要素数。結果の文字列(配列)の長さを指定する。デフォルトは-1,つまり配列(文字列)の末尾にコピーする,あるいは端末0に合わせるという意味です。