Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Нет времени изучать MQL5? Библиотека исходников для вас!
yu-sha
1042
yu-sha 2010.01.21 23:35 

Перебираю строку посимвольно

for (int i=0; i<StringLen(s1)-1; i++) {
  int ch=StringGetCharacter(s1,i);
  //Здесь нужно к другому string'у добавить ch
  StringAdd(s2, ???);
}

 StringAdd требует в качестве второго параметра тип string 

Что делать?

Через дополнительный string и SetStringCharacter как-то совсем некачественно и ресурсоемко получается

Документация по MQL5: Основы языка / Типы данных / Тип string
Документация по MQL5: Основы языка / Типы данных / Тип string
  • www.mql5.com
Основы языка / Типы данных / Тип string - Документация по MQL5
kombat
3276
kombat 2010.01.21 23:42  

может так:

StringAdd(s2, (string)ch);

yu-sha
1042
yu-sha 2010.01.21 23:45  
kombat:

может так:


Не-а, добавляет IntToStr(ch)

Если есть string, то должен быть char и не иначе как дефолтнодвухбайтовый 

Ilyas
1205
Ilyas 2010.01.22 09:12  

Забирать символ в виде строки можно функцией StringSubstr

 

yu-sha
1042
yu-sha 2010.01.22 09:38  

mql5:

Забирать символ в виде строки можно функцией StringSubstr

 

 

Спасибо

Не дороговато ли по производительности работать с integer'ом через динамические string'и ?

Особенно в контексте многотысячных итераций?

Может стоит сделать StringAdd(string &s, int w_char) ? 

Slawa
Модератор
6832
Slawa 2010.01.22 10:39  
yu-sha:

 

Спасибо

Не дороговато ли по производительности работать с integer'ом через динамические string'и ?

Особенно в контексте многотысячных итераций?

Может стоит сделать StringAdd(string &s, int w_char) ? 

Есть такая функция StringSetCharacter, при помощи которой можно добавлять символ к концу строки.
kombat
3276
kombat 2010.01.22 16:06  

Если я правильно понял, то надобно из цифр составить некое число.

Подобное реализовал в "генераторе магиков"

Мож сгодится... (для мт4)

int MagCreat(int a, int p, int t)
{
string mag, as, ps, ts;
//
if(a<0||a>99) 
{Print("Ошибка магика. Значение A: "+a+", не должно превышать 99 и быть меньше 0."); a=0;}
if(a>=0&&a<10) as="0"+a;
//
if(p<0||p>99) 
{Print("Ошибка магика. Значение P: "+p+", не должно превышать 99 и быть меньше 0."); p=0;}
if(p>=0&&p<10) ps="0"+p;
//
if(p<0||p>6) 
{Print("Ошибка магика. Значение T: "+t+", не должно превышать 5 и быть меньше 0."); t=0;}
ts=t;
//
mag="8"+as+StringSubstr(WindowExpertName(),2,3)+ps+ts;
//
return(StrToInteger(mag));
}
//выдано 9 разрядов, начинающееся с 8 например 8 48 364 99 1

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

yu-sha
1042
yu-sha 2010.01.22 17:09  
stringo:
Есть такая функция StringSetCharacter, при помощи которой можно добавлять символ к концу строки.

 Похоже, приемлемое решение найдено:

  int L=StringLen(s1);
  for (int i=0; i<L; i++) {
    int ch=StringGetCharacter(s1,i);
    if (ch=='(' || ch==')' || ch==',') {
      StringSetCharacter(s2,StringLen(s2),ch);
    }
  }

 Обращаю внимание на одинарные кавычки в условии if (...) - на двойные компилятор выдает Warning implicit conversion from 'number' to 'string'

В документации по поводу одинарных и двойных кавычек ничего не нашел.

Проверил:   "A" != 'A' 

Немного некрасиво, что "парные" по смыслу функции Get и Set оперируют разными типами: short (2 байта) и int (4 байта). Подсознательно ожидаешь ushort в обоих случаях.

 bool  StringSetCharacter(
   string&  string_var,       // строка
   int      pos,              // позиция
   short    character         // символ
   );

 

int  StringGetCharacter(
   string  string_value,     // строка
   int     pos               // позиция символа в строке
   );

Задачу считаю решенной - код должен быть более эффективным, чем работа через промежуточный string

Спасибо всем откликнувшимся  !

Evgeniy Logunov
716
Evgeniy Logunov 2010.01.22 20:33  
yu-sha:

Проверил:   "A" != 'A' 

Первое - это строка, а второе - символ. Аналогично языкам типа C/C++.
/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий