[ВНИМАНИЕ, ТЕМА ЗАКРЫТА!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда. - страница 1086
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
А это, б**дь, что тогда такое?
bool Fun_New_Bar() // Ф-ия обнаружения ..
{ // .. нового бара
static datetime New_Time=0; // Время текущего бара
Это называется инициализация статической переменной. Ноль будет присваиваться лишь при инициализации этой переменной.
О как! Круто. Вызвали подпрограмму, проинициализировалась статическая переменная. Подпрограмма завершила работу, бросив свои переменные в адресном пространстве оперативной памяти. И самое гдавное, не освободив само пространство от занятости, Так что-ли?
Твоя статик-инициализация в твоей подпрограмме будет происходить на каждом новом тике ЗАНОВО!!!! Это касается инициализации всех переменных для всех подпрограмм. Область видимости и время жизни у твоей статик-переменной какое, А?
О как! Круто. Вызвали подпрограмму, проинициализировалась статическая переменная. Подпрограмма завершила работу, бросив свои переменные в адресном пространстве оперативной памяти. И самое гдавное, не освободив само пространство от занятости, Так что-ли?
О как! Круто. Вызвали подпрограмму, проинициализировалась статическая переменная. Подпрограмма завершила работу, бросив свои переменные в адресном пространстве оперативной памяти. И самое гдавное, не освободив само пространство от занятости, Так что-ли?
Твоя статик-инициализация в твоей подпрограмме будет происходить на каждом новом тике ЗАНОВО!!!! Это касается инициализации всех переменных для всех подпрограмм. Область видимости и время жизни у твоей статик-переменной какое, А?
Да, проверьте на своём графике М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);
}
Проверить то правильность работы легко. К чему эти теоретизирование? Практика -критерий истины. Вы должны быть довольны, если вдруг выявите у себя пробел в своих знаниях. Я так в таких случаях всегда доволен и говорю спасибо тому кто меня просвятил.
Согласен. Погорячился. Мои извинения. Проверяем статик. Пишем скрипт
//+------------------------------------------------------------------+ //| Старт работы скрипта | //+------------------------------------------------------------------+ 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
Что же. Увы, вынужден признать, что статик не реинициализируется. Тогда код сработает. Плохо дело. :( Такие нюансы справка языка должна пояснять. Справка говорит илшь о том, что статическая переменная не теряет своего значения по выходу из функции. Но она не говорит, что при повторной инициализации эта перемнная не реинициализируется. Пипец, я снова нарвался на тот факт, что справка в метаэдиторе не полна. Блин, думал уже и не попадусь :)))))))
Согласен. Погорячился. Мои извинения. Проверяем статик. Пишем скрипт
Компилим, кидаем на график. В результате получаем: http://s2.ipicture.ru/uploads/20101229/k2u2OUqX.jpg
Что же. Увы, вынужден признать, что статик не реинициализируется. Тогда код сработает. Плохо дело. :( Такие нюансы справка языка должна пояснять. Справка говорит илшь о том, что статическая переменная не теряет своего значения по выходу из функции. Но она не говорит, что при повторной инициализации эта перемнная не реинициализируется. Пипец, я снова попался. Блин, думал уже и не попадусь :)))))))
Главное не расстраивайтесь, мы все здесь учимся. Так бывает, что какой-то нюанс ускользает от внимания, и узнаёшь о нём, когда казалось, что уже всё знаешь.
В справке сказано, что инициализация статической переменной однократна, а это значит. что реинициализации как таковой не существует.
Главное не расстраивайтесь, мы все здесь учимся. Так бывает, что какой-то нюанс ускользает от внимания, и узнаёшь о нём, когда казалось, что уже всё знаешь.
Та я не расстраиваюсь, о том, что выяснился пробел в знаниях - я расстраиваюсь когда выявляю косяки в своём коде, когда потратил на поиски не 1 час, измучился, а потом выясняется, что это не мой косяк, а косяк справочной системы или косяк терминала. Если просуммировать время, которое я за последние 6 лет программинга потратил на выявление ошибок, связанных с такими косяками, то могу сказать, что довольно большой кусок моей жизни попросту выброшен на помойку. Вот это-то и расстраивает - время жизни улетает на фигню. Улетает и не возвращается. Ну а сегодняшняя ситуация не расстроила - наоборот порадовала - мне не пришлось тратить ночи напролёт в поисках ошибки - она выявилась быстро.
Николай, ещё раз мои извинения - я 6 лет думал, что пременная объявленная проинициализированная значением внутри функции, реинициализируется при повторном вызове этой функции. (Про переменные глобального уорвня терминала я молчу - это другая песня). Оказалось, что из правила есть исключения. Урок я получил сегодня просто королевский!
В справке сказано, что инициализация статической переменной однократна, а это значит. что реинициализации как таковой не существует.
Цитирую справку:
Статические переменные инициализируются однократно перед вызовом специализированной функции init(),
А мы где проинициализировали статическую переменную? В подпрограмме. Нарушили правило инициализации - нарушили.
Перед вызовом функции init() статическая переменная небыла ни объявлена, ни вызвана из подпрограммы. Вот это-то и вносит путанницу. Раз перед блоком init() небыло инициализации статической переменной, то правило однократности теряет силу, так как оно привязано к конкретному участку структуры программы. Именно об этом справка и говорит. Но, зараза, не выполняет сказанного - реинициализация всё равно не происходит не смотря на то, что правило однократности потеряло силу!
Дело в том, что правило однократности накладывает жёсткость. Тут вступает в силу связь равнообъёмности между субъектом и предикатом суждения. А значит это эквиваленция - одно без другого не существует.
Но и поять же, язык снова позволяет ещё и в другом нарушить правило однократности. Если объявить эту переменную как положено и если инициализация значением возможна только перед блоком инициализации, то ни где в коде больше нельзя эту переменную инициализировать, так как это будет нарушением правила однократности. Но сделанный мной скрипт показывает, что это не так - переменную можно проинициализировать другим значением по-ходу дела.
Не использовал я ни когда этих переменный в своих кодах, и использовать не буду, раз тут такие нарушения правил. Не известно что там ещё за "подводные камни" с ними кроются.
У МЕНЯ ПРОБЛЕМА ....
Когда настраиваю почту в настройках терминала, В SMTP - я использую smtp.gmail.com:25
МНЕ выдает ошибку - Mail: 530 5.7.0 Must issue a STARTTLS command first. l3sm2329679fan.0Цитирую справку:
А мы где проинициализировали статическую переменную? В подпрограмме. Нарушили правило инициализации - нарушили.
Перед вызовом функции init() статическая переменная небыла ни объявлена, ни вызвана из подпрограммы. Вот это-то и вносит путанницу. Раз перед блоком инициализации небыло инициализации статической переменной, то правило однократности теряет силу, так как оно привязано к конкретному участку структуры программы. Именно об этом справка и говорит. Но, зараза, не выполняет сказанного - реинициализация всё равно не происходит не смотря на то, что правило однократности потеряло силу!
Ещё в учебнике есть пример использования статической переменной, из которого понятно, что инициализация её производится однократно, иначе счётчик тиков бы не работал.