"ダミー "からの質問 - ページ 35

 
Silent:

はい、3文字までなら削除可能です

そういう問題じゃないんです。

そして、より有能な同志からの返答を待つのです))
 
tol64:
必要な時に、このテーマ、このテーマと勉強するようにしてください。ある種の「レバー」(機能)が必要なシステムになったら、それを使って実験を始めるのです。この勉強法は(私の場合)かなり効果があることがわかりました)))。
はい、そうです、入力パラメータでiniteから抜け出せません :) また、配列がなければ、さらに先へ進むのはかなり難しいでしょう、4でテストしました。
 
tol64:
そして、より有能な同志からの返答を待つのです))
待っている :)
 
Silent:
待ってください :)

もっといいのは、待たないことだ)。どんどん実験してください))

宣言時に配列から値を削除する。ヘルプにあるようなものなのでしょう。

string result[];
そして、エラーが発生することもありません。私の理解では、to_split 変数で指定された文字列全体が配列に配置され その後部分文字列の抽出が 行われるのだと思います。
Документация по MQL5: Строковые функции / StringSubstr
Документация по MQL5: Строковые функции / StringSubstr
  • www.mql5.com
Строковые функции / StringSubstr - Документация по MQL5
 
tol64:

もっといいのは、待たないことだ)。どんどん実験してください))

宣言時に配列から値を削除する。ヘルプに書いてある通りなんでしょうね。

そして、エラーは発生しません。私の理解では、to_split 変数で指定した文字列全体を配列に入れ その後部分文字列の抽出を 行うようです。

クリアです。ただ、これは潜在的な落とし穴で、実際に私のコードでこのエラーに遭遇しましたが、動作しました - エラー付きです。

例えば、CopyBufferのヘルプテキストは次のとおりです。

Если необходимо копировать заранее известное количество данных,
то лучше это делать в статически выделенный буфер,
чтобы избежать излишнего перевыделения памяти.

どこにロジックがあるんだ? つまり、StringSplitと何が違うんだ?

また、すべての配列をダイナミックにすると、メモリが足りなくなります。

Upgr ArrayResize with zeroing は、もちろん変形版ですが、私は好きではありません。

 
tol64:

私の理解では、to_split 変数で指定した文字列全体を配列に入れ その中から部分文字列 を抽出する。

いや、そんなはずはない。
 
Silent:

あなたの例では、StringSplit()関数自体が、パラメータとして渡された配列に必要なメモリ量を確保することが問題です。

つまり、静的配列は(十分なメモリがあれば)機能するが、人が再分割しようとするためにエラーを引き起こすことが判明したのです。

静的配列と分散動的配列を試すだけで、わかると思います。

void OnStart()
  {
//---
   string to_split="мама_мыла_раму"; // строка для разбивки на подстроки
   string sep="_";                // раздедитель в виде символа
   ushort u_sep;                  // код символа разделителя
   string result[3];               // массив для получения строк
   //ArrayResize(result,3);    
//--- получим код разделителя
   u_sep=StringGetCharacter(sep,0);
   //--- разобьем строку на подстроки
   int k=StringSplit(to_split,u_sep,result);
   Print("GetLastError=",GetLastError()); // это я добавил чтоб видеть есть ли ошибка   
//--- выведем комментарий 
   PrintFormat("Получено строк: %d. Использован разделитель '%s' с кодом %d",k,sep,u_sep);
   //--- теперь выведем все полученные строки
   if(k>0)
     {
      for(int i=0;i<k;i++)
        {
         PrintFormat("result[%d]=%s",i,result[i]);
        }
     }
  }
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
Urain:

静的配列と分散動的配列で変種を試してみると、明らかになります。

動的配列を試すには、ArrayResize(result,3); をアンコメントしてください。その場合、コンパイル時に警告が表示されます。

 
tol64:

動的な配列を試すには、ArrayResize(result,3); をアンコメントすればよい。その場合、コンパイル時に警告が出ます。


これは解決不可能な問題なのか、それともダイナミックなものにするのか。
 
Urain:

あなたの例では、StringSplit()関数自体が、パラメータとして渡された配列に必要なメモリ量を確保することが問題です。

このため、静的配列は(十分なメモリがあれば)機能しますが、人々が再分割しようとするため、エラーが発生します。

では、静的配列でStringSplit()は使えるのか、使えないのか?

できれば、メモリが十分であればエラーにならないはずです。そうでない場合は、動作しないはずです。