来自一个 "傻瓜 "的问题 - 页 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是一种变体,但我不喜欢它。

 
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()?

如果你可以,如果有足够的内存,就不应该有错误。如果没有,就不应该工作。