Помогите научиться программировать. - страница 2

 
Alexey Viktorov:

Спасибо за такой пример.

Я думал, что я один предпочитаю так раскладывать всё, а не писать хз как

хз — в переводе на русский «хотелось-бы знать»… не подумайте плохого…

Лучше использовать классы из стандартной библиотеки, чтобы вообще не писать всякие длинные PositionGet... и т.п.

 
Dmitry Fedoseev:
Спасибо. Перевариваю.
 
Alexey Viktorov:

Спасибо за такой пример.

Я думал, что я один предпочитаю так раскладывать всё, а не писать хз как

А в чем проблема?

Не сочтите за "coder nazi", но меня, например, напрягают подобные конструкции:

for(int index=PositionsTotal()-1; index>=0; index--) { /* тело цикла */ }

Глаз режет. Не лучше ли сделать не "хз как", а вот так:

int index = PositionsTotal();

while (index-- > 0) { /* тело цикла */ }

Или вот такое "шиткодерство":

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

где PositionsTotal() вызывается на каждую итерацию цикла!

Нормальный кодер никогда не будет делать в теле цикла, перебирающего позиции по их индексу, манипуляции (чего, сл.Б, здесь нет), приводящие к изменению их количества. Это просто высший пилотаж безграмотности и глючного кода. Нужно, если по-хорошему, перезапускать весь цикл, если что-то подобное предполагается.

А еще некоторые любят что-то типа такого:

double Lot;

// где-то вычисляется значение Lot, финальная проверка и приведение к допустимым границам фееричны:
if(Lot > MaxLot) Lot = MaxLot;
if(Lot < MinLot) Lot = MinLot;

// а то и вовсе:
if(Lot > MaxLot) Lot = MaxLot;
  else
    if(Lot < MinLot) Lot = MinLot;

// а не проще ли сделать так?
Lot = MathMin(MathMax(Lot, MinLot), MaxLot);

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

И это все тиражируется из кода в код по принципу копипасты.

Таки вот ...

 
Tio Nisla:

...

Или вот такое "шиткодерство":

где PositionsTotal() вызывается на каждую итерацию цикла!

...

Уверен? Хотел поумничать, а сел в калошу...

И специально зарегистрировался для этого? Вот так вот - с первого поста и в лужу...

 
Dmitry Fedoseev:

Уверен? Хотел поумничать, а сел в калошу...

И специально зарегистрировался для этого? Вот так вот - с первого поста и в лужу...

Эх, дорогой. "Учите матчасть", Элджера и Кнута. Не надо на личности.

Ладно, объясню:

    for  (            int i=0            ;          i<PositionsTotal()            ;    i++     )    { }
    ^^^               ^^^^^^^                       ^^^^^^^^^^^^^^^^^^                 ^^^          ^^^
объявление   |   объявление переменной   | проверка условия выполнения цикла:     | инкремент  | тело цикла
  цикла      | типа "int", инициализация | 'i' < значения, возвращаемого функцией | переменной |
типа "for"   |       значением '0'       | которая вызывается на каждую итерацию  |

Так понятно, родной?

Если нет, вдумчиво читать https://learnc.info/c/loop.html начиная где-то с [ctrl+f , искать "Цикл for"]

Вот даже не поленился ссылку найти.

И учитесь писать грамотный, красивый, лаконичный код. Вам бы с ассемблера начинать было, да на микроконтроллерах, где каждый такт и байт на счету.

P.S.

Вот, даже не поленился, продемонстрировать эксперту простецкий примерчик его цикла "for".

int OnInit()
{
   for(int i=0;i<somefunc();i++) PrintFormat("array[%d]\n", i);
   return(INIT_SUCCEEDED);
}

int somefunc() {
   static int count = 0;
   PrintFormat("Туточки уже %d-й раз!\n", ++count);
   return 3; // это типа количество чего-то там, элементов массива например
}

А это результат прогона:

2021.05.03 08:01:36.343 show_the_shitz EURJPY,H1: initialized
2021.05.03 08:01:36.343 show_the_shitz EURJPY,H1: Туточки уже 4-й раз!
2021.05.03 08:01:36.343 show_the_shitz EURJPY,H1: array[2]
2021.05.03 08:01:36.343 show_the_shitz EURJPY,H1: Туточки уже 3-й раз!
2021.05.03 08:01:36.343 show_the_shitz EURJPY,H1: array[1]
2021.05.03 08:01:36.343 show_the_shitz EURJPY,H1: Туточки уже 2-й раз!
2021.05.03 08:01:36.343 show_the_shitz EURJPY,H1: array[0]
2021.05.03 08:01:36.343 show_the_shitz EURJPY,H1: Туточки уже 1-й раз!

Заметно, что функция не только вызывается на каждой итерации, но даже +1 раз в финале.

Так то вот.

Циклы в Си. Циклы с постусловием, предусловием, Цикл for со счётчиком.
Циклы в Си. Циклы с постусловием, предусловием, Цикл for со счётчиком.
  • 1989.04.14
  • Sypachev S.S. 1989-04-14 sypachev_s_s@mail.ru Stepan Sypachev
  • learnc.info
Циклы в Си: цикл while с предусловием, цикл do while с постусловием, цикл for со сщётчиком. Бесконечный цикл. Оператор break. Оператор continue. Примеры работы с циклами
 
Tio Nisla:

Эх, дорогой. "Учите матчасть", Элджера и Кнута. Не надо на личности.

Ладно, объясню:

Так понятно, родной?

Если нет, вдумчиво читать https://learnc.info/c/loop.html начиная где-то с [ctrl+f , искать "Цикл for"]

Вот даже не поленился ссылку найти.

И учитесь писать грамотный, красивый, лаконичный код. Вам бы с ассемблера начинать было, да на микроконтроллерах, где каждый такт и байт на счету.

P.S.

Вот, даже не поленился, продемонстрировать эксперту простецкий примерчик его цикла "for".

А это результат прогона:

Заметно, что функция не только вызывается на каждой итерации, но даже +1 раз в финале.

Так то вот.

Аплодирую! Продолжайте...


 
Dmitry Fedoseev:

Аплодирую! Продолжайте...


Зачем вы так измазались? Да еще в Сеть выложили. Мамка же заругает!
 
Если кого-то какой-то код напрягает, глаза режет, в мире существует много других профессий: дворник, грузчик, уборщик, санитар... 
 
Dmitry Fedoseev:

Уверен? Хотел поумничать, а сел в калошу...

И специально зарегистрировался для этого? Вот так вот - с первого поста и в лужу...

Интересненький у вас разговор получается)))

Господа, личности личностями, но давайте всё таки выясним истину. 

Я вот на примере  вижу, что    PositionsTotal() вызывается на каждую итерацию цикла.

Вы же Дмитрий, утверждаете, что компилятор делает по другому.  Мне не понятно. Объясните.

//+------------------------------------------------------------------+
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
CTrade         m_trade;
CSymbolInfo    m_symbol;
//-------------------------------------------------------------------+
void OnInit()
  {
   m_symbol.Name(Symbol());
   m_symbol.RefreshRates();

   for(int i = 0; i < 10; i++)
     {
      m_trade.Buy(1, _Symbol, m_symbol.Ask() + i * 2 * _Point, 0, 0);
     }

//---закомментировать не нужное
   for(int i = 5; i < PositionsTotal(); i++) // так удаляются только 3 сделки
     {
      m_trade.PositionClose(_Symbol);
     }
//---закомментировать не нужное
   int index = PositionsTotal();
   for(int i = 5; i < index; i++) // так удаляются 5 сделок
     {
      m_trade.PositionClose(_Symbol);
     }

//вывод: PositionsTotal() вызывается на каждой итерации
  }
//+------------------------------------------------------------------+

Если вы хотите сказать, что функция   PositionsTotal() не пересчитывает каждый раз позиции, а просто возвращает значение переменной в которой записано количество открытых позиций, то да вы правы, нет смысла объявлять ещё одну переменную, но тогда при чём тут компилятор?

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

Что то не складывается у меня.

 
Aleksandr Slavskii:

Интересненький у вас разговор получается)))

Хотел добавить ранее, что если функция somefunc() кроме возврата количества чего-то там, производит еще какие-то манипуляции, вычисляет торговые параметры например, то такое использование порождает трудно уловимые артефакты и может привести автора кода в ступор: "Шта??? Как это 4 раза??? O_o F$#@!!! Там же три раза должно быть? Почему мне советник лжет?". Вот это я и назвал "шиткодом", что эксперта возмутило до корней волос. Не стал заострять внимание, ибо очевидно, но вы сделали это за меня. Но не учли тот момент, что адресовать по индексу, который динамически рассчитывается без переинициализации массива - это нечто. В голых "сях" такое приводит обычно к GPF, в "плюсах" с умными указателями и массивами к исключению и его обработчику. В mql не понятно к чему.
Причина обращения: