Если необходимо копировать заранее известное количество данных,
то лучше это делать в статически выделенный буфер,
чтобы избежать излишнего перевыделения памяти.
どこにロジックがあるんだ? つまり、StringSplitと何が違うんだ?
また、すべての配列をダイナミックにすると、メモリが足りなくなります。
Upgr ArrayResize with zeroing は、もちろん変形版ですが、私は好きではありません。
voidOnStart()
{
//---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]);
}
}
}
はい、3文字までなら削除可能です
そういう問題じゃないんです。必要な時に、このテーマ、このテーマと勉強するようにしてください。ある種の「レバー」(機能)が必要なシステムになったら、それを使って実験を始めるのです。この勉強法は(私の場合)かなり効果があることがわかりました)))。
そして、より有能な同志からの返答を待つのです))
待ってください :)
もっといいのは、待たないことだ)。どんどん実験してください))
宣言時に配列から値を削除する。ヘルプにあるようなものなのでしょう。
string result[];
そして、エラーが発生することもありません。私の理解では、to_split 変数で指定された文字列全体が配列に配置され、 その後部分文字列の抽出が 行われるのだと思います。もっといいのは、待たないことだ)。どんどん実験してください))
宣言時に配列から値を削除する。ヘルプに書いてある通りなんでしょうね。
そして、エラーは発生しません。私の理解では、to_split 変数で指定した文字列全体を配列に入れ、 その後部分文字列の抽出を 行うようです。クリアです。ただ、これは潜在的な落とし穴で、実際に私のコードでこのエラーに遭遇しましたが、動作しました - エラー付きです。
例えば、CopyBufferのヘルプテキストは次のとおりです。
どこにロジックがあるんだ? つまり、StringSplitと何が違うんだ?
また、すべての配列をダイナミックにすると、メモリが足りなくなります。
Upgr ArrayResize with zeroing は、もちろん変形版ですが、私は好きではありません。
私の理解では、to_split 変数で指定した文字列全体を配列に入れ、 その中から部分文字列 を抽出する。
あなたの例では、StringSplit()関数自体が、パラメータとして渡された配列に必要なメモリ量を確保することが問題です。
つまり、静的配列は(十分なメモリがあれば)機能するが、人が再分割しようとするためにエラーを引き起こすことが判明したのです。
静的配列と分散動的配列を試すだけで、わかると思います。
静的配列と分散動的配列で変種を試してみると、明らかになります。
動的配列を試すには、ArrayResize(result,3); をアンコメントしてください。その場合、コンパイル時に警告が表示されます。
動的な配列を試すには、ArrayResize(result,3); をアンコメントすればよい。その場合、コンパイル時に警告が出ます。
これは解決不可能な問題なのか、それともダイナミックなものにするのか。
あなたの例では、StringSplit()関数自体が、パラメータとして渡された配列に必要なメモリ量を確保することが問題です。
このため、静的配列は(十分なメモリがあれば)機能しますが、人々が再分割しようとするため、エラーが発生します。
では、静的配列でStringSplit()は使えるのか、使えないのか?
できれば、メモリが十分であればエラーにならないはずです。そうでない場合は、動作しないはずです。