пример приведите, пожалуйста
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, хотя то же можно было-бы заменить.
Все верно. Подстрока находится на 19-ой позиции. Ошибок нет.
Поиск с 5-ой позиции не отменяет счетчик позиций.
Или Вы думали, что вернется позиция 14?
Просьба не заменять наличие нескольких функций из Бейсика обобщением "в других языках программирования". Язык С (MQL4 как раз представляет собой упрощенный язык C) более низкоуровневый по сравнению с другими. Поэтому и функции такие.
Попробуйте с пятой позиции поискать подстроку "Быстрая". Найдете?
Когда появится язык программирования, позволяющий любое действие выполнять с помощью одной встренной функции, я непременно все начну писать на нем. Жаль только, что все программы будуть состоять из одного предложения. Творчеству и полету мысли не останется места. Сравнение двух языков (в частности, Basic и C) на наличие и отсутствие конкретных операторов всегда дает двоякий результат: есть операторы, которые присутствуют только в одном из них. Или только в другом. И, несмотря на наличие TrimAll'а в Basic'е, мне приходится писать на нем методы, выполняющие "черновую" работу. А еще очень удобное выражение a++; вынужден "заменять" жутко громоздким "a = a + 1". Жуть, правда?
Я мог бы и дальше рассуждать по поводу сравнения, но, боюсь, это оффтопик в пределах конференции вообще.
P.S. Когда я использовал слово "заменить", я использовал это слово исключительно в целях удобочитаемости в контексте топика. Читать следует "использовать". В течении суток я обычно использую 2-4 различных языка программирования, в т.ч. MQL и Basic. И уже привык адекватно оценивать архитектурные особенности каждого из них. И наличие TrimAll или отсутствие инкремента не считаю достоинством или недостатком. Достоинство, стоящее упоминания, например - в Basic'е, начиная с .Net, и продолжая в VB2005, теперь можно использовать слово class по самое "нихочу". И я этому рад. И буду рад, когда такая возможность появится в MQL. Оптимистичнее надо, товарищи. И мануал по поводу StringFind перечитать еще пару раз.
P.P.S. Заранее прошу меня извинить, если я обидел кого-то в лучших чувствах. Все сказанное - просто мое личное мнение, как всегда. Откланиваюсь за сим.
Новую тему не стал создавать.. вопрос по этой же функции
в цикле читаю глобальные переменные, и если имя переменной не содержит указанные подстроки, пишу эти переменные в файл.
однако условия не работают и пишутся все переменные подряд. что я делаю не так?
код:
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);
}
в цикле читаю глобальные переменные, и если имя переменной не содержит указанные подстроки, пишу эти переменные в файл.
однако пишется все подряд, что я делаю не так?
Похоже, ошибка в условии. Приведите список названий переменных.
Я бы заменил это сложное условие четырьмя условиями типа:
if (StringFind( name,"cb",0 )>=0)
continue;
На мой взгляд, для читаемости кода это - намного лучше.
"Если подстрока найдена - идем на следующую итерацию цикла". А подобные сложные условия - требуют хорошего представления логических связей "не-или".
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
int StringFind( string text, string matched_text, int start=0)
Поиск подстроки. Возвращает номер позиции в строке, с которой начинается искомая подстрока, либо -1, если подстрока не найдена.
Параметры
text - Строка в которой производится поиск.
matched_text - Искомая подстрока.
start - Позиция в строке, с которой должен быть начат поиск.
Какое бы значение start я не указывал, она всегда ищет с 0 позиции. Скажите, а что функции Left,Right, TrimAll трудно было сделать? Или это опять как-то связано с безопасностью?