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

 

Вопрос про динамические массивы

double open_main_array[] - переменная класса  

инициализация 

ArraySetAsSeries(open_main_array,true);

 1-й вызов фунции в которой есть такой код

CopyOpen(Symbol(),  PERIOD_M15, 0, Count, open_main_array); 

 2-й вызов фунции

CopyOpen(Symbol(),  PERIOD_M15, 0, Count, open_main_array);

В массиве open_main_array будет содержаться данные которые скопированы во 2-м вызове или массив увеличится и будет содержать данные 1-го и 2-го вызова?

а так можно использвать:

ArrayFree(open_main_array) 

CopyOpen(Symbol(),  PERIOD_M15, 0, Count, open_main_array);

Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
Renat:

 uninialized variable - означает, что переменная гарантированно имеет ветку прохода, когда она не инициализирована. например, в switch явно пропущен default, в котором надо явным образом инициализировать MainPrice (или при объявлении явно занулить).

 Насчёт "гарантированного прохода". Вот такой кусочек кода:

            (1)         double local_low;
            (2)         uint index_interior=i-k;
            (3)         bool interrupcion=false;
            (4)         for(uint n=1;n<Ac-k;n++)
            (5)           {
            (6)            if(low[index_interior-n]<low[index_interior-n-1])
            (7)              {
            (8)               local_low=low[index_interior-n];
            (9)               interrupcion=true;
            (10)              break;
            (11)              }
            (12)          }  
            (13)        if(interrupcion)
            (14)          {
            (15)           if(EspacioFalladoPlus0<high[index_interior]-local_low)
                       ...

Для последней строчки (строка 15) выдаётся "possible use of uninitialized variable 'local_low' ".

Но из-за использования bool-переменной interrupcion в строке 9 сразу после инициализации переменной local_low в строке 8 получается, что в строке 15 переменная local_low будет гарантированно инициализированной. Поэтому на текущий момент предупреждение "possible use of uninitialized variable 'local_low' " означает не "гарантированное", а всего лишь возможное наличие ветки прохода, при котором переменная не инициализирована.

 
Yedelkin:

 Насчёт "гарантированного прохода". Вот такой кусочек кода:

Для последней строчки (строка 15) выдаётся "possible use of uninitialized variable 'local_low' ".

Но из-за использования bool-переменной interrupcion в строке 9 сразу после инициализации переменной local_low в строке 8 получается, что в строке 15 переменная local_low будет гарантированно инициализированной. Поэтому на текущий момент предупреждение "possible use of uninitialized variable 'local_low' " означает не "гарантированное", а всего лишь возможное наличие ветки прохода, при котором переменная не инициализирована.

Абсолютно верно выдает предупреждение.

Не путайте свою самоуверенность с реальностью. Реальность раскрывается после множества проектов и понимания, что "этого не может быть ибо логика ведет так-то" случается ежедневно.

 
Renat:

Не путайте свою самоуверенность с реальностью. Реальность раскрывается после множества проектов и понимания, что "этого не может быть ибо логика ведет так-то" случается ежедневно.

А адекватное объяснение можно получить? Код приведён, "самоуверенное" утверждение изложено, в чём ошибка? Эзотерику не понимаю.

...Если же учитывать перевод фразы "possible use of uninitialized variable", то предупреждение, действительно, выдаётся "абсолютно верное". Но не о не "гарантированном", а всего лишь о возможном наличии ветки прохода, при котором переменная не инициализирована. То есть ровно то, о чём "самоуверенно" говорю я.

 
Yedelkin:

А адекватное объяснение можно получить? Код приведён, "самоуверенное" утверждение изложено, в чём ошибка? Эзотерику не понимаю.

А если бы у вас вместо

 

interrupcion=true;

 было (например)

interrupcion = (someFunction1(input) > someFunction2(input2)) && (someFunction3() < 1) || (someFunction1(input3) * someFunction3() > 10);
 вы бы тоже претензии предъявляли? Особенно, если someFunctionN состоит из сотен строк кода?

 

По Вашему куску кода - да, переменная инициализирована, если выполняется 15-я строка. Но что прикажете делать компилятору в примере, который я привёл? Задача сложная. Да и решать её нет такой уж необходимости.

А ошибка называется "possible (возможно) use of uninitialized variable" (хотя Вы итак об этом знаете)

 А лучше явно присвоить какое-нить значение переменной local_low. Поверьте, это может уберечь Вас от возможных ошибок в будущем (код правится, что-то удаляется, что-то перемещается, что-то меняется, а строка 13 может выпасть из этого процесса)

 
Yedelkin:

А адекватное объяснение можно получить? Код приведён, "самоуверенное" утверждение изложено, в чём ошибка? Эзотерику не понимаю.

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

Поэтому вопросы по критике строгих мер тут неуместны.

 
Renat:

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

Поэтому вопросы по критике строгих мер тут неуместны.

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

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

 
notused:

 вы бы тоже претензии предъявляли? Особенно, если someFunctionN состоит из сотен строк кода?

И Вы туда же. Ну нет у меня претензий. Есть уточнение, что не всё так категорично, как утверждает Ренат.

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

 
Yedelkin:

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

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

У вас   "possible use of uninitialized variable 'local_low' "

 А что выдаётся  если

(1)         double local_low=1.1; // или что-то другое
 
Yedelkin:

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

Перечитайте мои ответы с точки зрения руководителя софтверной компании, который довел до рынка много программных проектов.

Иначе, оставшись на уровне "любого программиста", так и не поймете в чем ошибка.

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