Нужна ли независимая проверка продуктов Фриланса? - страница 26

 
VOLDEMAR:
Во обще то вы не правы ... StringSplit(EnumToString(timeframe), '_', results); строка разбивается на 2 части так как '_' символ в строке один (PERIOD_M1), затем эти две строки засовываются в массив, и ретурном возвращается ячейка массива под номером 1 то бишь М1 , М5 , М15 , логически ошибки нет ...
   //--- разобьем строку на подстроки
   int k=StringSplit(to_split,u_sep,result);
   //--- выведем комментарий 
   PrintFormat("Получено строк: %d. Использован разделитель '%s' с кодом %d",k,sep,u_sep);

   //--- теперь выведем все полученные строки

Посмотрите в этом примере куда возвращается значение StringSplit в переменную K

 
TheXpert:
switch был жеж в MQL4

Я и не спорю. C4 говорил что switch не нужен

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Нужна ли независимая проверка продуктов Фриланса?

C-4, 2015.01.27 20:21

 Не нужен здесь switch. Да и вообще функция явно избыточна, т.к. достаточно ее заменить на EnumToString. Но если уж она нужна, я бы написал что-то типа такого:

//+------------------------------------------------------------------+
//| Возвращает строковое представление переданного таймфрейма.       |
//| В случае неудачи возвращает NULL.                                |
//| INPUT:                                                           |
//|     timeframe - Таймфрейм, строковое значение которого           |
//|                 необходимо получить. Может принимать одно из     |
//|                 значений перечисления ENUM_TIMEFRAMES.           |
//| RESULT:                                                          |
//|     Строковое представление таймфрейма. NULL в случае неудачи.   |
//+------------------------------------------------------------------+
string PeriodToString(ENUM_TIMEFRAMES timeframe)
{
   string results[];
   if(!ArrayResize(results, 2))
      return NULL;
   StringSplit(EnumToString(timeframe), '_', results);
   return results[ArraySize(results)-1];
}

Первый (уже третий) вызвался к расстрельной стенке, кхе-кхе:)))


 

 

, а enum ов не было. Я и предложил им предоставить решение без этих двух компонент.

 
f2011:

Просто у вашего варианта нет никаких преимуществ перед кондовым свичем, а в простоте он сильно проигрывает. Это как раз в тему о хорошем стиле

Неужели else и return в тех реалиях тоже отсутствовали?

А если ENUM_TIMEFRAME будет содержать тысячу идентификаторов? Будете тысячу строчек case вставлять? А если ENUM_TIMEFRAME решат расширить новым таймфреймом, например так: PERIOD_M45? А если PERIOD_* поменяют на TIMEFRAME_*?  Мой код продолжит работать, это главное. Программирование - это описание частных случаев обобщенным методом.
 
Alexey:
   //--- разобьем строку на подстроки
   int k=StringSplit(to_split,u_sep,result);
   //--- выведем комментарий 
   PrintFormat("Получено строк: %d. Использован разделитель '%s' с кодом %d",k,sep,u_sep);

   //--- теперь выведем все полученные строки

Посмотрите в этом примере куда возвращается значение StringSplit в переменную K

Да ну ?

Параметры
string_value
[in]  Строка, из которой необходимо получить подстроки. Сама строка при этом не изменяется.
pos[in]  Код символа разделителя. Для получения кода можно использовать функцию StringGetCharacter().
result[]
[out]  Массив строк, в который помещаются полученные подстроки.
Возвращаемое значение
Количество полученных строк в массиве result[]. Если разделитель в переданной строке не найден, то в массив будет помещена только одна исходная строка.
Если строка string_value пустая или NULL, то функция вернет ноль. В случае ошибки функция вернет -1. Для получения кода ошибки нужно вызвать функцию GetLastError().

Массив строк, в который помещаются полученные подстроки.
 
f2011:
Тема окупает свой попкорн :)
Да вполне окупает
 
VOLDEMAR:
Оператор switch быстрее варианта  массивами в 10 раз, но при этом по размеру кода больше ...  Массивы в топку...
Щаз забацаем реализацию на ассоциативном массиве. Дадим *:;%№*" всем антагонистам Оккамы!
 
VOLDEMAR:
Во обще то вы не правы ... StringSplit(EnumToString(timeframe), '_', results); строка разбивается на 2 части так как '_' символ в строке один (PERIOD_M1), затем эти две строки засовываются в массив, и ретурном возвращается ячейка массива под номером 1 то бишь М1 , М5 , М15 , логически ошибки нет ...
Вы наверно забыли что первая ячейка массива является 0 а не 1, правка вашем случае это будет PERIOD_CURRENT Текущий период
 
Alexey:
Вы наверно забыли что первая ячейка массива является 0 а не 1

 Придется повториться.

 
Alexey:
Вы наверно забыли что первая ячейка массива является 0 а не 1

В 0 принимается PERIOD в 1 принимается M1, размер массива 2, поэтому что бы получить то что находится в массиве под 1 делаем

results[ArraySize(results)-1];

иначе 2-1=1


 

Можно так:

string PeriodToString(ENUM_TIMEFRAMES timeframe)
  {
   if(timeframe == PERIOD_CURRENT)
      timeframe = Period();
   string results[];
   if(!ArrayResize(results,1))
      return NULL;
   StringSplit(EnumToString(timeframe),'_',results);
   return results[ArraySize(results)-1];
  }

 Какая разница. Код все равно будет работать.

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