Ошибки, баги, вопросы - страница 2044

 
Alexey Navoykov:

Баг с инициализацией статических переменных.  В старых билдах его не было.

Кому не трудно, отравьте это в сервис-деск.  У меня больше нет желания общаться с ними там.

Это не баг, отсюда обсуждалось. Выжимка

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

Особенности языка mql4, тонкости и приёмы работы

Alexey Viktorov, 2017.04.30 08:54

последовательность инициализации: (для тех кто не знает об этом)

Сначала переменные глобального уровня потом статические расположенные в зависимости от первоочерёдности функций, OnInit(), OnTick() или OnCalculate()... дальше мне было не интересно, а локальные в своё время. Так вот в этом коде получается, что функция вызывается до окончания инициализации статических переменных, отсюда и ошибка о которой идёт речь. Функция вызвана раньше чем инициализирована переменная

 
fxsaber:

Это не баг, отсюда обсуждалось. Выжимка

Значит если это обсуждалось между Вами и Alexey Viktorov, то даёт вам основания полагать, что это не баг? )  Причём этот человек сам заявляет, что его уровень знания программирования значительно ниже вашего. Т.е. его можно вычеркнуть из списка.  Остаётесь только вы )  Обсудили сами с собой, значит это не баг )

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

 

Ещё один баг в новых билдах:

template<typename T>
int F1(const T& array[])
{
  return ArrayMaximum(array);
}


template<typename T>
int F2(const T& array[]) { return F1(array); }


void OnStart()
  {
    int arr[4]= { 1, 2, 3 };
    Print(F2(arr));  // Выдаёт -1 !!!
  }


Эх, как же тут всё сыро.  Думал, обновлюсь таки на новые билды, а то на старых уже Маркет не принимает продукты.   А тут баг на баге!

 
Alexey Navoykov:

Значит если это обсуждалось между Вами и Alexey Viktorov, то даёт вам основания полагать, что это не баг? )  Причём этот человек сам заявляет, что его уровень знания программирования значительно ниже вашего. Т.е. его можно вычеркнуть из списка.  Остаётесь только вы )  Обсудили сами с собой, значит это не баг )

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

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

А документацию прочесть мама не велит??? Специально для таких я вставил цитату из документации

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

Особенности языка mql4, тонкости и приёмы работы

Alexey Viktorov, 2017.04.29 12:50

А ничего что в справке написано что статическая переменная ... читайте сами

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


Но никак не функцией.

Вот так работает

#property strict
#property indicator_chart_window

int TestBrokenStatic()
{
   static int stInt = 101;
   stInt++;
   return stInt;
}

int OnInit()
{
   static int result = 0;
   result = TestBrokenStatic();
   Print("TestStatic Expected result 102   - Actual result=", result);
   result = TestBrokenStatic();
   Print("TestStatic Expected result 103   - Actual result=", result);
   
   return INIT_SUCCEEDED;
}

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
   return rates_total;
}
2017.04.29 13:49:51.546 !Test USDCHF,M15: TestStatic Expected result 103   - Actual result=103
2017.04.29 13:49:48.457 !Test USDCHF,M15: TestStatic Expected result 102   - Actual result=102
2017.04.29 13:49:40.089 Custom indicator Test\!Test USDCHF,M15: loaded successfully

 
Alexey Navoykov:

Ещё один баг в новых билдах:

Эх, как же тут всё сыро.  Думал, обновлюсь таки на новые билды, а то на старых уже Маркет не принимает продукты.   А тут баг на баге!

А у меня правильно показывает!

 
Alexey Viktorov:

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

А документацию прочесть мама не велит??? Специально для таких я вставил цитату из документации

Ясно, тогда прошу прощения, не заметил сразу.  Удивительно конечно, как они успели втихаря это поменять, и ничего никому не сказали.  Тогда не понятно, почему компилятор никак не реагирует на то, что выполняется недопустимая операция.   Т.е. баг в любом случае имеет место
 
fxsaber:

А у меня правильно показывает!


Хм, а какой у вас билд?  У меня 1653

 
Alexey Navoykov:

Значит если это обсуждалось между Вами и Alexey Viktorov, то даёт вам основания полагать, что это не баг? )  Причём этот человек сам заявляет, что его уровень знания программирования значительно ниже вашего. Т.е. его можно вычеркнуть из списка.  Остаётесь только вы )  Обсудили сами с собой, значит это не баг )

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

Если нахожу логическое (непротиворечивое) объяснение результату, то не вижу бага. Не считаю, что доказательство бага приемлемо, если результат не совпадает с C++. Это в C++ кто-то так подумал и сделал. А мог и не подумать так и, соответственно, не сделать. Поэтому лучше не ссылаться на что-то там, а основываться на какой-то своей внутренней концепции, как должно быть. И желательно, чтобы "свое" было, действительно, своим. А не результатом незаметного навязывания стереотипов "как надо" по мере набирания опыта программирования.

Мне не западло ошибаться. Учусь потихоньку на своих граблях.

 
Alexey Navoykov:

Хм, а какой у вас билд?  У меня 1653

1653x64.

 
fxsaber:

1653x64.

Странно, откуда тогда расхождение...


Пусть кто-то ещё проверит у себя.