По-моему, вы бред пишите. Если объявить локальную переменную внутри цикла ли, функции ли, то значение глобальной переменной с тем же именем не затрётся, а останется прежним, но компилятор вас предупредит, что вы объявили локальную переменную с таким же именем, как и уже существующая глобальная, и работа внутри функции или блока кода, в пределы видимости которого входит вновь объявленная переменная, не повлияет на значение глобальной переменной. Он вас предупреждает об этом, чтобы вы понимали, что это новая переменная, и чтобы вы не ожидали изменения значения глобальной переменной после выхода за пределы видимости блока, в котором объявили новую переменную с таким же именем, как уже существующая глобальная.
По-простому: всё, что находится внутри квартиры - всё относится ко всем комнатам и во всех комнатах оно обще-квартирное (глобальная переменная). А всё, что находится внутри комнаты - то относится только к комнате, и не видно из других комнат (это локальные переменные).
Ещё проще? Пожалуйста:
Если вы испортили воздух в туалете (локально), то он именно там и испорчен. При этом во всей квартире (глобально) знают (результат ваших туалетных опытов), что в туалет лучше не соваться... Но воздух - понятие для всей квартиры, и все жильцы знают об испорченном воздухе в туалете. При этом лишь счастливчик, находящийся в туалете, может в полной мере ощутить все прелести изменения локальной обстановки в пределах замкнутого пространства (локальное влияние значения переменной). Остальные об этом знают, но не ощущают. Когда же вы покидаете туалет, то теряете ощущения (локальные значения), которые испытывали в туалете, и начинаете дышать свежим воздухом (получаете глобальные значения воздуха), при этом, как и все остальные, зная, что в толчке пипец (результат работы функции заражения воздуха, влияющий на общий процесс жизнедеятельности всей квартиры)...
Надеюсь, понятно рассказал
Открыли истину в своем опусе - спасибо! Получается, что объявление переменной внутри блока с таким же названием, что и глобальная переменная, приводит к блокировки данных от глобальной переменной внутри блока... а предупреждение об уже объявленной переменной значит убрать не удастся, так?
-Aleks-: Открыли истину в своем опусе - спасибо! Получается, что объявление переменной внутри блока с таким же названием, что и глобальная переменная, приводит к блокировки данных от глобальной переменной внутри блока... а предупреждение об уже объявленной переменной значит убрать не удастся, так?
Спасибо, но первую ссылку я ранее читал, а вторая подтвердила логику которой я пользовался при написании кода.
Однако смущает это утверждение из второй ссылки "...за пределами этого цикла действует другая переменная с тем же именем...", из неё следует, что значение глобальной переменной останется прежним не смотря на то, что внутри блока будет объявлена новая переменная с таким же именем, но сие бред так как если объявить новую переменную, то значение прежней затрется, тогда мне не ясно, какой тут смысл использовать и хранить две разных переменных (локальную и глобальную), но с одинаковым значением?
к сожелению там неправильно написано :(
void CalculateLWMA(int rates_total,int prev_calculated,int begin,constdouble &price[])
{
inti,limit;
staticint weightsum=0;
double sum=0;
//---if(prev_calculated==0)
{
limit=MA_Period+begin;
//--- set empty value for first limit barsfor(i=0; i<limit; i++) LineBuffer[i]=0.0;
//--- calculate first visible valuedouble firstValue=0;
for(inti=begin; i<limit; i++)
{
int k=i-begin+1;
weightsum+=k;
firstValue+=k*price[i];
}
firstValue/=(double)weightsum;
LineBuffer[limit-1]=firstValue;
}
else
{
limit=prev_calculated-1;
}
for(i=limit;i<rates_total;i++)
{
sum=0;
for(int j=0; j<MA_Period; j++) sum+=(MA_Period-j)*price[i-j];
LineBuffer[i]=sum/weightsum;
}
//---
}
Artyom Trishkin: Зачем мне даёте код? Не пойму что в нём искать нужно... да и временем ограничен. Можно как-то рассказать для чего всё это и в чём ошибка в справке
Ну не ошибка же: цикл с глобальной i (синяя), и ещё один цикл с локальной i (красная)
if(prev_calculated==0)
{
limit=MA_Period+begin;
//--- set empty value for first limit barsfor(i=0; i<limit; i++) LineBuffer[i]=0.0;//--- calculate first visible valuedouble firstValue=0;
for(inti=begin; i<limit; i++){ int k=i-begin+1; weightsum+=k; firstValue+=k*price[i]; }
firstValue/=(double)weightsum;
LineBuffer[limit-1]=firstValue;
}
По-моему, вы бред пишите. Если объявить локальную переменную внутри цикла ли, функции ли, то значение глобальной переменной с тем же именем не затрётся, а останется прежним, но компилятор вас предупредит, что вы объявили локальную переменную с таким же именем, как и уже существующая глобальная, и работа внутри функции или блока кода, в пределы видимости которого входит вновь объявленная переменная, не повлияет на значение глобальной переменной. Он вас предупреждает об этом, чтобы вы понимали, что это новая переменная, и чтобы вы не ожидали изменения значения глобальной переменной после выхода за пределы видимости блока, в котором объявили новую переменную с таким же именем, как уже существующая глобальная.
По-простому: всё, что находится внутри квартиры - всё относится ко всем комнатам и во всех комнатах оно обще-квартирное (глобальная переменная). А всё, что находится внутри комнаты - то относится только к комнате, и не видно из других комнат (это локальные переменные).
Ещё проще? Пожалуйста:
Если вы испортили воздух в туалете (локально), то он именно там и испорчен. При этом во всей квартире (глобально) знают (результат ваших туалетных опытов), что в туалет лучше не соваться... Но воздух - понятие для всей квартиры, и все жильцы знают об испорченном воздухе в туалете. При этом лишь счастливчик, находящийся в туалете, может в полной мере ощутить все прелести изменения локальной обстановки в пределах замкнутого пространства (локальное влияние значения переменной). Остальные об этом знают, но не ощущают. Когда же вы покидаете туалет, то теряете ощущения (локальные значения), которые испытывали в туалете, и начинаете дышать свежим воздухом (получаете глобальные значения воздуха), при этом, как и все остальные, зная, что в толчке пипец (результат работы функции заражения воздуха, влияющий на общий процесс жизнедеятельности всей квартиры)...
Надеюсь, понятно рассказал
Открыли истину в своем опусе - спасибо! Получается, что объявление переменной внутри блока с таким же названием, что и глобальная переменная, приводит к блокировки данных от глобальной переменной внутри блока... а предупреждение об уже объявленной переменной значит убрать не удастся, так?
Спасибо, но первую ссылку я ранее читал, а вторая подтвердила логику которой я пользовался при написании кода.
Однако смущает это утверждение из второй ссылки "... за пределами этого цикла действует другая переменная с тем же именем...", из неё следует, что значение глобальной переменной останется прежним не смотря на то, что внутри блока будет объявлена новая переменная с таким же именем, но сие бред так как если объявить новую переменную, то значение прежней затрется, тогда мне не ясно, какой тут смысл использовать и хранить две разных переменных (локальную и глобальную), но с одинаковым значением?
к сожелению там неправильно написано :(
к сожелению там неправильно написано :(
там в справке неправильно написано
Зачем мне даёте код? Не пойму что в нём искать нужно... да и временем ограничен. Можно как-то рассказать для чего всё это и в чём ошибка в справке
это код из справки
об'является "i" в начале функции
потом в цикле снова об'является "i"
это код из справки
об'является "i" в начале функции
потом в цикле снова об'является "i"
Ну не ошибка же: цикл с глобальной i (синяя), и ещё один цикл с локальной i (красная)
Ну не ошибка же: цикл с глобальной i (синяя), и ещё один цикл с локальной i (красная)
Компилятор ругаться будет