[ВНИМАНИЕ, ТЕМА ЗАКРЫТА!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда. - страница 1086

 
drknn:


А это, б**дь, что тогда такое?

bool Fun_New_Bar() // Ф-ия обнаружения ..
{ // .. нового бара


static datetime New_Time=0; // Время текущего бара

Это называется инициализация статической переменной. Ноль будет присваиваться лишь при инициализации этой переменной.
 
khorosh:
Это называется инициализация статической переменной. Ноль будет присваиваться лишь при инициализации этой переменной.


О как! Круто. Вызвали подпрограмму, проинициализировалась статическая переменная. Подпрограмма завершила работу, бросив свои переменные в адресном пространстве оперативной памяти. И самое гдавное, не освободив само пространство от занятости, Так что-ли?

Твоя статик-инициализация в твоей подпрограмме будет происходить на каждом новом тике ЗАНОВО!!!! Это касается инициализации всех переменных для всех подпрограмм. Область видимости и время жизни у твоей статик-переменной какое, А?

 
drknn:

О как! Круто. Вызвали подпрограмму, проинициализировалась статическая переменная. Подпрограмма завершила работу, бросив свои переменные в адресном пространстве оперативной памяти. И самое гдавное, не освободив само пространство от занятости, Так что-ли?
Проверить то правильность работы легко. К чему это теоретизирование? Практика -критерий истины. Вы должны быть довольны, если вдруг выявите у себя пробел в своих знаниях. Я так в таких случаях всегда доволен и говорю спасибо тому кто меня просвятил.
 
drknn:


О как! Круто. Вызвали подпрограмму, проинициализировалась статическая переменная. Подпрограмма завершила работу, бросив свои переменные в адресном пространстве оперативной памяти. И самое гдавное, не освободив само пространство от занятости, Так что-ли?

Твоя статик-инициализация в твоей подпрограмме будет происходить на каждом новом тике ЗАНОВО!!!! Это касается инициализации всех переменных для всех подпрограмм. Область видимости и время жизни у твоей статик-переменной какое, А?


Да, проверьте на своём графике М1! Ведь всё работает как надо, вроде! И пиликает не каждый тик, а только когда сформируется новый!

int start() // Спец. функция start
{
if(Fun_New_Bar())//проверка наличия нового бара
{
Alert("Сформировался новый бар"); // Вывод на экран
}
return(0); // Выход из start()
}
//--------------------------------------------------------------------
bool Fun_New_Bar() // Ф-ия обнаружения ..
{ // .. нового бара
static datetime New_Time=0; // Время текущего бара
bool New_Bar=false; // Нового бара нет
if(New_Time!=Time[0]) // Сравниваем время
{
New_Time=Time[0]; // Теперь время такое
New_Bar=true; // Поймался новый бар
}
return(New_Bar);
}

 
khorosh:
Проверить то правильность работы легко. К чему эти теоретизирование? Практика -критерий истины. Вы должны быть довольны, если вдруг выявите у себя пробел в своих знаниях. Я так в таких случаях всегда доволен и говорю спасибо тому кто меня просвятил.


Согласен. Погорячился. Мои извинения. Проверяем статик. Пишем скрипт

//+------------------------------------------------------------------+
//|                 Старт работы скрипта                             |
//+------------------------------------------------------------------+
int start(){
  int SchVizovov=0;
	for(int i=1;i<5;i++){
		SchVizovov=Proverka(i);
	}
  Alert("-------------------");
	return(0);
}
//+------------------------------------------------------------------+
//|                  Пользовательские подпрограммы                   |
//+------------------------------------------------------------------+
int Proverka(int Sch){
	
	static int My_value=0; //
	if(My_value==0){
		My_value=Sch;
		Alert("Статическая переменная инициализирована. Proverka() вызвана ",Sch,"-й раз. Статическая переменная = ",My_value);
		return(Sch);
	}
	else{
	 My_value=Sch;
	 Alert("Статическая не реинициализирована. Proverka() вызвана ",Sch,"-й раз. Статическая переменная = ",My_value);
	}
	return(Sch);
}

Компилим, кидаем на график. В результате получаем: http://s2.ipicture.ru/uploads/20101229/k2u2OUqX.jpg

Что же. Увы, вынужден признать, что статик не реинициализируется. Тогда код сработает. Плохо дело. :( Такие нюансы справка языка должна пояснять. Справка говорит илшь о том, что статическая переменная не теряет своего значения по выходу из функции. Но она не говорит, что при повторной инициализации эта перемнная не реинициализируется. Пипец, я снова нарвался на тот факт, что справка в метаэдиторе не полна. Блин, думал уже и не попадусь :)))))))

 
drknn:


Согласен. Погорячился. Мои извинения. Проверяем статик. Пишем скрипт

Компилим, кидаем на график. В результате получаем: http://s2.ipicture.ru/uploads/20101229/k2u2OUqX.jpg

Что же. Увы, вынужден признать, что статик не реинициализируется. Тогда код сработает. Плохо дело. :( Такие нюансы справка языка должна пояснять. Справка говорит илшь о том, что статическая переменная не теряет своего значения по выходу из функции. Но она не говорит, что при повторной инициализации эта перемнная не реинициализируется. Пипец, я снова попался. Блин, думал уже и не попадусь :)))))))

Главное не расстраивайтесь, мы все здесь учимся. Так бывает, что какой-то нюанс ускользает от внимания, и узнаёшь о нём, когда казалось, что уже всё знаешь.

В справке сказано, что инициализация статической переменной однократна, а это значит. что реинициализации как таковой не существует.

 
khorosh:
Главное не расстраивайтесь, мы все здесь учимся. Так бывает, что какой-то нюанс ускользает от внимания, и узнаёшь о нём, когда казалось, что уже всё знаешь.


Та я не расстраиваюсь, о том, что выяснился пробел в знаниях - я расстраиваюсь когда выявляю косяки в своём коде, когда потратил на поиски не 1 час, измучился, а потом выясняется, что это не мой косяк, а косяк справочной системы или косяк терминала. Если просуммировать время, которое я за последние 6 лет программинга потратил на выявление ошибок, связанных с такими косяками, то могу сказать, что довольно большой кусок моей жизни попросту выброшен на помойку. Вот это-то и расстраивает - время жизни улетает на фигню. Улетает и не возвращается. Ну а сегодняшняя ситуация не расстроила - наоборот порадовала - мне не пришлось тратить ночи напролёт в поисках ошибки - она выявилась быстро.

Николай, ещё раз мои извинения - я 6 лет думал, что пременная объявленная проинициализированная значением внутри функции, реинициализируется при повторном вызове этой функции. (Про переменные глобального уорвня терминала я молчу - это другая песня). Оказалось, что из правила есть исключения. Урок я получил сегодня просто королевский!

 
khorosh:

В справке сказано, что инициализация статической переменной однократна, а это значит. что реинициализации как таковой не существует.

Цитирую справку:

Статические переменные инициализируются однократно перед вызовом специализированной функции init(),

А мы где проинициализировали статическую переменную? В подпрограмме. Нарушили правило инициализации - нарушили.

Перед вызовом функции init() статическая переменная небыла ни объявлена, ни вызвана из подпрограммы. Вот это-то и вносит путанницу. Раз перед блоком init() небыло инициализации статической переменной, то правило однократности теряет силу, так как оно привязано к конкретному участку структуры программы. Именно об этом справка и говорит. Но, зараза, не выполняет сказанного - реинициализация всё равно не происходит не смотря на то, что правило однократности потеряло силу!

Дело в том, что правило однократности накладывает жёсткость. Тут вступает в силу связь равнообъёмности между субъектом и предикатом суждения. А значит это эквиваленция - одно без другого не существует.

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

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

 

У МЕНЯ ПРОБЛЕМА ....

Когда настраиваю почту в настройках терминала, В SMTP - я использую smtp.gmail.com:25

МНЕ выдает ошибку - Mail: 530 5.7.0 Must issue a STARTTLS command first. l3sm2329679fan.0
 
drknn:

Цитирую справку:

А мы где проинициализировали статическую переменную? В подпрограмме. Нарушили правило инициализации - нарушили.

Перед вызовом функции init() статическая переменная небыла ни объявлена, ни вызвана из подпрограммы. Вот это-то и вносит путанницу. Раз перед блоком инициализации небыло инициализации статической переменной, то правило однократности теряет силу, так как оно привязано к конкретному участку структуры программы. Именно об этом справка и говорит. Но, зараза, не выполняет сказанного - реинициализация всё равно не происходит не смотря на то, что правило однократности потеряло силу!

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

//--------------------------------------------------------------------
// staticvar.mq4
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------------
int start()                            // Специальная функция start()
  {
   static int Tick;                    // Статическая локальная перем
   Tick++;                             // Счётчик тиков
   Comment("Поступил тик № ",Tick);    // Сообщение, содержащее номер
   return;                             // Оператор выхода из start()
  }
//--------------------------------------------------------------------
Причина обращения: