Вопросы от "чайника" - страница 35

 
Silent:

да, если убрать до 3 букв

дело не в этом.

 

Тогда ждём ответа более компетентных товарищей.)))
 
tol64:
А Вы попробуйте изучать ту или иную тему по мере надобности. Вот как только дойдёте до момента в своей системе, когда Вам понадобятся те или иные "рычаги" (функции), тогда и начинайте с ними экспериментировать. Я нашёл, что такой метод изучения (в моём случае) довольно неплохо работает.)))
Да так и делаю, из инита с входными параметрами вылезти не могу :) а без массивов дальше совсем тяжко будет, проверено на 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() со статичными массивами?

Если можно, ошибки не должно быть, если памяти достаточно. Если нельзя, - она не должна работать.

Причина обращения: