Предупреждение об объявленной переменной - страница 3

 
Vasyl Nosal:

Или на глобальном уровне объяви или

 double MASS[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

:)))))))))))))))))))))) 

Не очень красиво, так лучше:

double MASS[20] = { 0 };

Результат тот же. 

 
Alexey Kozitsyn:

Не очень красиво, так лучше:

double MASS[20] = { 0 };

Результат тот же. 

Не очень красиво придумывать possible of use uninitialization variable
 
Alexey Volchanskiy:

Нет, вернется ноль. И это потом можно проверить.

Местная переменная не инициализируется автоматом 0?
 
Vasyl Nosal:
Не очень красиво придумывать possible of use uninitialization variable
Зря Вы так говорите. Это очень полезный функционал! Вы можете попытаться присвоить какой-либо переменной значение элемента массива или использовать значение одного из элементов массива для сравнения, а там будет мусор. И Вы потом доооолго будете гадать, почему же, когда я пытаюсь проверить, а записано ли в элемент массива значение программа выдает, что записано, а на самом деле нет.
 
Vasyl Nosal:
Местная переменная не инициализируется автоматом 0?

Локальные нет, не инициализируются. Читайте документацию.

Документация по MQL5: Основы языка / Переменные / Инициализация переменных
Документация по MQL5: Основы языка / Переменные / Инициализация переменных
  • www.mql5.com
Основы языка / Переменные / Инициализация переменных - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Vasyl Nosal:
Местная переменная не инициализируется автоматом 0?

Лично я всегда, все переменные инициализирую. Если при создании переменной неизвестно, какое значение должно быть в ней - я инициализирую ее значением WRONG_VALUE или EMPTY_VALUE.

Это также позволяет избежать хитрых ошибок использования неинициализированных переменных.

 
Alexey Kozitsyn:

Локальные нет, не инициализируются. Читайте документацию.

А сколько раз мне надо запустить скрипт чтобы алерт не 0 выдал?

void OnStart()
  {
int i;

Alert(i);

  }
 
Vasyl Nosal:

А сколько раз мне надо запустить скрипт чтобы алерт не 0 выдал?

То, что в переменной ноль сейчас - не значит, что так будет всегда. Неинициализированная переменная может иметь любое значение. Видимо, по дефолту его обнуляют, вероятно, как раз, чтобы начинающие не нарывались на ошибки. Но, не факт, что так будет всегда - в любом билде разработчики могут для ускорения перестать это делать. Поэтому правильнее считать, что в неинициализированной переменной - может быть совершенно любое, неизвестное значение.
 
George Merts:
То, что в переменной ноль сейчас - не значит, что так будет всегда. Неинициализированная переменная может иметь любое значение. Видимо, по дефолту его обнуляют, вероятно, как раз, чтобы начинающие не нарывались на ошибки. Но, не факт, что так будет всегда - в любом билде разработчики могут для ускорения перестать это делать. Поэтому правильнее считать, что в неинициализированной переменной - может быть совершенно любое, неизвестное значение.

Добавлю, в С/С++ локальные переменные выделяются на стеке. Могу предположить, что в MQL4/5 тоже сделали так. А в стеке может быть все, что угодно, оставшееся от вызовов других функций. Результаты меняются даже от прогона к прогону скрипта

2015.11.01 05:11:19.317 TestStack (EURUSD.e,M1) i1= -1  i2= 441449680  i3= 0

2015.11.01 05:11:17.821 TestStack (EURUSD.e,M1) i1= -1  i2= 441711504  i3= 0

2015.11.01 05:11:07.148 TestStack (EURUSD.e,M1) i1= -1  i2= 442038912  i3= 0

 

void OnStart()
{
    int i;
    if(i != 0)
        Print("i= ", i);  
    FillStack();     
    SeeStack();     
}

void FillStack()
{
    int i1=1, i2=2, i3=3;
    i1++; i2++; i3++;
}     

void SeeStack()
{
    int i1, i2, i3;
    Print("i1= ", i1, "  i2= ", i2, "  i3= ", i3);  
}    
    
}     
 
Vasyl Nosal:
Не очень красиво придумывать possible of use uninitialization variable

А чего тут некрасивого? Если переводить не дословно "Возможно использование не инициализированной переменной", где вы подумали, что компилятор вам это разрешил и сообщил об этом (это неточность в понимании смысла), а переводить именно по смыслу "Вероятно использование не инициализированной переменной", где, если по рабоче-крестьянски, компилятор говорит: "дружище, в данной строке, ты вероятно используешь не инициализированную переменную", что может привести к бяке.

Надеюсь понятно разъяснил смысл предупреждения?

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