Как выделить число из сложносоставной строки? - страница 7

 
leon_17 #:


Кто понимает этот код, помогите избавиться от ошибки 5041 ( Позиция за пределами строки ) после исполнения этой функции.
Только, что обнаружил.

Пробел(ы) в конце строки?

 
JRandomTrader #:

Пробел(ы) в конце строки?

Если бы я знал (

Alert(_LastError);   после использования функции выдает ошибку 5041 во всех случаях.


 
leon_17 #:

Если бы я знал (

Alert(_LastError);   после использования функции выдает ошибку 5041 во всех случаях.

Такое может быть при обработке строки с (пробелами или русскими буквами 'Р') в конце строки.

Также, русские буквы (абвгдежзий) обрабатываются как цифры.

 
leon_17 #:

Если бы я знал (

Alert(_LastError);   после использования функции выдает ошибку 5041 во всех случаях.


функций различного рода здесь много.

какую функцию используете и покажите входную строку

 
Renat Akhtyamov #:

функций различного рода здесь много.

какую функцию используете и покажите входную строку

Ниже полный код, который я использовал для быстрого тестирования:

//+------------------------------------------------------------------+
//|                                              Parser_Number_5.mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {

   string row = "First -12345.123456 FORM + //  123456 -0.88";
   double array[];

   GetDoubleArrayFromString(row,  array);

   double result = array[0];

   double result_2 = array[1];

   double result_3 = array[2];


   Alert(result);
   Alert(result_2);
   Alert(result_3);

   Alert(_LastError);
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool IsNextNumber(string &s, int &i, double &d)
  {
   static const double dec[20] = {1,10,100,1e3,1e4,1e5,1e6,1e7,1e8,1e9,1e10,1e11,1e12,1e13,1e14,1e15,1e16,1e17,1e18,1e19};
   uchar c = uchar(s[i++]);
   while(c==32)
      c = uchar(s[i++]);
   bool is_num = (c<='9'&& c>='0');
   if(is_num || c=='-' || c=='.')
     {
      int j = 0;
      int p = (c=='.') ? 0 : -1;
      bool is_not_null = is_num;
      ulong mantissa = is_num ? c-48 : 0;
      bool minus = (c=='-');
      while(true)
        {
         c = uchar(s[i++]);
         while(c==32)
            c = uchar(s[i++]);
         j++;
         if(c=='.')
           {
            if(p<0)
               p=j;
            else
               break;
           }
         else
            if(c<='9'&& c>='0')
              {
               is_not_null = true;
               mantissa = mantissa*10 + c - 48;
              }
            else
               break;
        }
      if(is_not_null)
        {
         d = (double)mantissa;
         if(minus)
            d = - d;
         if(p>=0)
           {
            p=j-p-1;
            d/=dec[p];
           }
         i--;
         return true;
        }
     }
   i--;
   return false;
  }

////////////////////////////////////////////////////////////////////////////////////////////
int GetDoubleArrayFromString(string Str, double &d[])
  {
   const int Size = StringLen(Str) - 1;
   double Res = 0;
   int size = 0;

   for(int i = 0; i <= Size; i++)
     {
      if(IsNextNumber(Str,i,Res))
        {
         size++;
         ArrayResize(d,size);
         d[size-1] = Res;
        }
     }
   return(size);
  }
//+------------------------------------------------------------------+
 

После i++ нигде не проверяется конец массива(строки).

Видимо, предполагается, что в конце строки обязательно будет \n, \r\n, \0.

 
JRandomTrader #:

После i++ нигде не проверяется конец массива(строки).

Видимо, предполагается, что в конце строки обязательно будет \n, \r\n, \0.

Да код сырой непротестированный
 
leon_17 #:


Вам не плохо бы освоить debug, потратив максимум час, чтобы быстро находить источник ошибок и понимать как работает код.
 
leon_17 #:
"First -12345.123456 FORM + //  123456 -0.88";

попробуйте такую

"First -12345.123456    ";

мне кажется что строкой надо поиграться, выяснить в чем причина для начала 

ну и тут у Вас несколько чисел

в принципе я и не получил ответ на мой вопрос о количестве чисел в строке

Ваш путь все таки посоветованный мной: сначала массив, потом обработка.

То есть последовательно проверяем каждый элемент массива и выцарапываем то, что нам нужно, хоть так хоть сяк, пока не получим искомое удовлетворяющее собственным требованиям.

примеров тут накидали много

задача решаема.

 
Renat Akhtyamov #:

попробуйте такую

И такую: "где дед.беда" ))