Вопрос к разработчикам -Функция StringFind()

 

int StringFind( string text, string matched_text, int start=0)


Поиск подстроки. Возвращает номер позиции в строке, с которой начинается искомая подстрока, либо -1, если подстрока не найдена.

Параметры

text - Строка в которой производится поиск.
matched_text - Искомая подстрока.
start - Позиция в строке, с которой должен быть начат поиск.

Какое бы значение start я не указывал, она всегда ищет с 0 позиции. Скажите, а что функции Left,Right, TrimAll трудно было сделать? Или это опять как-то связано с безопасностью?
 
Какое бы значение start я не указывал, она всегда ищет с 0 позиции.

пример приведите, пожалуйста
 
Скажите, а что функции Left,Right, TrimAll трудно было сделать? Или это опять как-то связано с безопасностью?


string StringSubstr( string text, int start, int count=EMPTY)
Извлекает подстроку из текстовой строки, начинающейся c указанной позиции.
Функция возвращает копию извлеченной подстроки, если возможно, иначе возвращается пустая строка.

Это заменяет Left,Right.

string StringTrimLeft( string text)
функция урезает символы перевода каретки, пробелы и символы табуляции в левой части строки. Функция возвращает копию преобразованной строки, если это возможно, в противном случае возвращается пустая строка.
string StringTrimRight( string text)
Функция урезает символы перевода каретки, пробелы и символы табуляции в правой части строки. Функция возвращает копию преобразованной строки, если это возможно, в противном случае возвращается пустая строка.

Две эти функции - и есть TrimAll.

Выкурено из встроенного мануала, раздел "Строковые функции".
 
Вот пример:
//+------------------------------------------------------------------+
//|                                                        Proba.mq4 |
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"



//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
{
   string text = "Быстрая коричневая собака прыгает над ленивой лисой";
   int index1=StringFind(text, "собака прыгает", 0);//Поиск с 0 позиции
   int index2=StringFind(text, "собака прыгает", 5);//Поиск с 5 позиции
   Alert("index1: ",index1," index2: ",index2);
  
  
  
   Print("Блок init выполнен!");
   return(0);
}


результат:


20:39:57 Proba EURUSD,M30: Alert: index1: 19 index2: 19
20:39:57 Proba EURUSD,M30: Блок init выполнен!

to ReMAG: заменить можно многое, только в чём же тогда удобство функций MQL4, если вместо одной функции Right, я вынужден писать свою, собственную функцию, использую не одну встроенную функцию MQL4? Почему в других языках программирования наряду с TrimLeft и TrimRight, есть и TrimAll, хотя то же можно было-бы заменить.

 
20:39:57 Proba EURUSD,M30: Alert: index1: 19 index2: 19

Все верно. Подстрока находится на 19-ой позиции. Ошибок нет.
Поиск с 5-ой позиции не отменяет счетчик позиций.
Или Вы думали, что вернется позиция 14?

только в чём же тогда удобство функций MQL4, если вместо одной функции Right, я вынужден писать свою, собственную функцию, использую не одну встроенную функцию MQL4? Почему в других языках программирования наряду с TrimLeft и TrimRight, есть и TrimAll, хотя то же можно было-бы заменить.

Просьба не заменять наличие нескольких функций из Бейсика обобщением "в других языках программирования". Язык С (MQL4 как раз представляет собой упрощенный язык C) более низкоуровневый по сравнению с другими. Поэтому и функции такие.
 
На что же тогда влияет
start - Позиция в строке, с которой должен быть начат поиск
и для она вообще нужна? Ведь поиск фактически всегда начинается с 0 позиции...
 
и для она вообще нужна? Ведь поиск фактически всегда начинается с 0 позиции..

Попробуйте с пятой позиции поискать подстроку "Быстрая". Найдете?
 
to ReMAG: заменить можно многое, только в чём же тогда удобство функций MQL4, если вместо одной функции Right, я вынужден писать свою, собственную функцию, использую не одну встроенную функцию MQL4? Почему в других языках программирования наряду с TrimLeft и TrimRight, есть и TrimAll, хотя то же можно было-бы заменить.


Когда появится язык программирования, позволяющий любое действие выполнять с помощью одной встренной функции, я непременно все начну писать на нем. Жаль только, что все программы будуть состоять из одного предложения. Творчеству и полету мысли не останется места. Сравнение двух языков (в частности, Basic и C) на наличие и отсутствие конкретных операторов всегда дает двоякий результат: есть операторы, которые присутствуют только в одном из них. Или только в другом. И, несмотря на наличие TrimAll'а в Basic'е, мне приходится писать на нем методы, выполняющие "черновую" работу. А еще очень удобное выражение a++; вынужден "заменять" жутко громоздким "a = a + 1". Жуть, правда?
Я мог бы и дальше рассуждать по поводу сравнения, но, боюсь, это оффтопик в пределах конференции вообще.

P.S. Когда я использовал слово "заменить", я использовал это слово исключительно в целях удобочитаемости в контексте топика. Читать следует "использовать". В течении суток я обычно использую 2-4 различных языка программирования, в т.ч. MQL и Basic. И уже привык адекватно оценивать архитектурные особенности каждого из них. И наличие TrimAll или отсутствие инкремента не считаю достоинством или недостатком. Достоинство, стоящее упоминания, например - в Basic'е, начиная с .Net, и продолжая в VB2005, теперь можно использовать слово class по самое "нихочу". И я этому рад. И буду рад, когда такая возможность появится в MQL. Оптимистичнее надо, товарищи. И мануал по поводу StringFind перечитать еще пару раз.

P.P.S. Заранее прошу меня извинить, если я обидел кого-то в лучших чувствах. Все сказанное - просто мое личное мнение, как всегда. Откланиваюсь за сим.
 
ЭЭЭ... ууу... ааа... э... Ну не совсем бэйсик... скажем VBScript... В дельфи есть просто Trim... в 1С есть СокрЛП... С наступающим новым 2006 годом Вас, рыцари пера и топора... :-)
 

Новую тему не стал создавать.. вопрос по этой же функции

в цикле читаю глобальные переменные, и если имя переменной не содержит указанные подстроки, пишу эти переменные в файл.

однако условия не работают и пишутся все переменные подряд.  что я делаю не так? 

код: 

size=GlobalVariablesTotal(); 

....

for(int i=0;i<size;i++) 

        {

         name=GlobalVariableName(i);

         value=GlobalVariableGet( name );

        if  ( StringFind( name,"cb",0 )<0 || StringFind( name,"cs",0 )<0 || StringFind( name,"pikbt",0 )<0 || StringFind( name,"pikst",0 ) <0 )

          if (value>0) FileWrite(file_handle,name,value); 

         }

 
harbor:
 

в цикле читаю глобальные переменные, и если имя переменной не содержит указанные подстроки, пишу эти переменные в файл.

однако пишется все подряд, что я делаю не так? 

Похоже, ошибка в условии. Приведите список названий переменных.

Я бы заменил это сложное условие четырьмя  условиями типа:

if (StringFind( name,"cb",0 )>=0)

    continue;

На мой взгляд, для читаемости кода это - намного лучше.

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

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