[UYARI, KONU KAPALI!] Forumu kirletmemek için herhangi bir acemi sorusu. Profesyonel, kaçırmayın. Sensiz hiçbir yerde. - sayfa 1086

 
drknn :


Bu da ne böyle?

bool Fun_New_Bar() // Algılama fonksiyonu ..
{ // .. yeni çubuk


statik tarihsaat New_Time=0; // Geçerli çubuğun zamanı

Buna statik değişken başlatma denir. Sıfır, yalnızca bu değişken başlatıldığında atanacaktır.
 
khorosh :
Buna statik değişken başlatma denir. Sıfır, yalnızca bu değişken başlatıldığında atanacaktır.


Oh nasıl! Güzel. Alt program çağrıldı, statik değişken başlatıldı. Alt program, değişkenlerini RAM adres alanına bırakarak sonlandırıldı. Ve en önemlisi, alanın kendisini istihdamdan kurtarmadan, Ne olmuş yani?

Alt rutininizdeki statik başlatmanız, her yeni onay işaretinde TEKRAR gerçekleşecek!!!! Bu, tüm altyordamlar için tüm değişkenlerin başlatılmasıyla ilgilidir. Statik değişkeninizin kapsamı ve ömrü nedir, ha?

 
drknn :

Oh nasıl! Güzel. Bir alt program çağrıldı, statik bir değişken başlatıldı. Alt program, değişkenlerini RAM adres alanına bırakarak sonlandırıldı. Ve en önemlisi, alanın kendisini istihdamdan kurtarmadan, Ne olmuş yani?
Doğru çalışıp çalışmadığını kontrol etmek kolaydır. Bu neden teorileştiriyor? Pratik, gerçeğin kriteridir. Aniden bilginizde bir boşluk keşfederseniz mutlu olmalısınız. Böyle durumlarda her zaman tatmin olurum ve beni aydınlatan kişiye teşekkür ederim.
 
drknn :


Oh nasıl! Güzel. Bir alt program çağrıldı, statik bir değişken başlatıldı. Alt program, değişkenlerini RAM adres alanına bırakarak sonlandırıldı. Ve en önemlisi, alanın kendisini istihdamdan kurtarmadan, Ne olmuş yani?

Alt rutininizdeki statik başlatmanız, her yeni onay işaretinde TEKRAR gerçekleşecek!!!! Bu, tüm altyordamlar için tüm değişkenlerin başlatılmasıyla ilgilidir. Statik değişkeninizin kapsamı ve ömrü nedir, ha?


Evet, M1 grafiğinize bakın! Sonuçta, her şey olması gerektiği gibi çalışıyor, gibi! Ve her kene tıklamaz , ancak sadece yenisi oluştuğunda!

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 :
Doğru çalışıp çalışmadığını kontrol etmek kolaydır. Neden bu teoriler? Pratik, gerçeğin kriteridir. Aniden bilginizde bir boşluk bulursanız mutlu olmalısınız. Böyle durumlarda her zaman tatmin olurum ve beni aydınlatan kişiye teşekkür ederim.


Kabul ediyorum. Heyecanlanmak. Özür dilerim. Statik kontrol ediliyor. Senaryo yazmak

 //+------------------------------------------------------------------+
//|                 Старт работы скрипта                             |
//+------------------------------------------------------------------+
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);
}

Derliyoruz, çizelgeye atıyoruz. Sonuç olarak şunu elde ederiz: http://s2.ipicture.ru/uploads/20101229/k2u2OUqX.jpg

Ne. Ne yazık ki, statikin yeniden başlatılmadığını itiraf etmeliyim. Ardından kod çalışacaktır. Bu kötü. :( Dil yardımı bu tür nüansları açıklamalıdır. Yardım sadece statik bir değişkenin fonksiyondan çıktıktan sonra değerini kaybetmediğini söylüyor. Ama bu değişkenin yeniden başlatma sırasında yeniden başlatılmadığını söylemiyor. Vur, tekrar gerçekle karşılaştım metaeditördeki yardımın tamamlanmadığını.Lanet olsun, yakalanmayacağımı düşündüm :)))))))

 
drknn :


Kabul ediyorum. Heyecanlanmak. Özür dilerim. Statik kontrol ediliyor. Senaryo yazmak

Derliyoruz, çizelgeye atıyoruz. Sonuç olarak şunu elde ederiz: http://s2.ipicture.ru/uploads/20101229/k2u2OUqX.jpg

Ne. Ne yazık ki, statikin yeniden başlatılmadığını itiraf etmeliyim. Ardından kod çalışacaktır. Bu kötü. :( Dil yardımı bu tür nüansları açıklamalıdır. Yardım sadece statik bir değişkenin fonksiyondan çıktıktan sonra değerini kaybetmediğini söylüyor. Ama bu değişken yeniden başlatıldığında yeniden başlatılmadığını söylemiyor. Kahretsin, yine yakalandım. Kahretsin. , bir daha düşmem sandım :)))))))

Ana şey üzülmemek, hepimiz burada öğreniyoruz. Bazı nüanslar dikkatlerden kaçar ve her şeyi zaten biliyormuşsunuz gibi göründüğünde bunu öğrenirsiniz.

Yardım, statik bir değişkenin başlatılmasının tek seferlik olduğunu söylüyor, yani. bu şekilde yeniden başlatma mevcut değildir.

 
khorosh :
Ana şey üzülmemek, hepimiz burada öğreniyoruz. Bazı nüanslar dikkatlerden kaçar ve her şeyi zaten biliyormuşsunuz gibi göründüğünde bunu öğrenirsiniz.


Bilgide bir boşluk bulunduğu için üzülmem - Kodumdaki pervazları tanımladığımda üzülüyorum, 1 saatten fazla arama yaptığımda yoruldum ve sonra bunun benim canım olmadığı ortaya çıktı , ancak yardım sisteminin değeri veya terminalin değeri . Son 6 yılda bu tür pervazlarla ilgili hataları tespit etmek için harcadığım zamanı özetlerseniz, hayatımın oldukça büyük bir bölümünün çöpe atıldığını söyleyebilirim. Sinir bozucu olan budur - hayatın zamanı çöpe uçar. Uçar ve geri dönmez. Eh, şu anki durum beni üzmedi - aksine memnun oldum - geceler ve geceler boyunca hata aramak zorunda kalmadım - çabucak ortaya çıktı.

Nikolai, bir kez daha özür dilerim - 6 yıl boyunca, bir işlev içinde bir değerle bildirilen bir değişkenin, bu işlev tekrar çağrıldığında yeniden başlatıldığını düşündüm. (Terminalin global seviyesinin değişkenleri hakkında sessizim - bu başka bir hikaye). Kuralın istisnaları olduğu ortaya çıktı. Bugün aldığım ders sadece asil!

 
khorosh :

Yardım, statik bir değişkenin başlatılmasının tek seferlik olduğunu söylüyor, yani. bu şekilde yeniden başlatma mevcut değildir.

Referans alıntılama:

Statik değişkenler, özelleştirilmiş init() işlevi çağrılmadan önce bir kez başlatılır,

Ve statik değişkeni nerede başlattık? bir alt programda. Başlatma kuralı ihlal edildi - ihlal edildi.

init() işlevi çağrılmadan önce, statik değişken ne bildirilmiş ne de alt programdan çağrılmıştır. İşte burada kafa karışıklığı devreye giriyor. init() bloğundan önce statik bir değişken başlatma olmadığından, tek seferlik kural, program yapısının belirli bir bölümüne bağlı olduğu için gücünü kaybeder. Bu tam olarak referansın söylediği şey. Ancak, enfeksiyon söylenenleri yapmıyor - bir kerelik kuralın gücünü kaybetmesine rağmen yeniden başlatma hala gerçekleşmiyor!

Gerçek şu ki, bekarlık kuralı katılığı dayatır. Burada, yargının öznesi ile yüklemi arasındaki eşit hacim bağlantısı yürürlüğe girer. Yani bu bir eşdeğerdir - biri olmadan diğeri olmaz.

Ama yine, dil, birlik kuralını başka bir şekilde kırmanıza izin verir. Bu değişken olması gerektiği gibi bildirilirse ve bir değerle başlatma yalnızca başlatma bloğundan önce mümkünse, bu değişken kodda başka hiçbir yerde başlatılamaz, çünkü bu tek seferlik kuralı ihlal eder. Ancak yaptığım komut dosyası durumun böyle olmadığını gösteriyor - değişken, yol boyunca farklı bir değerle başlatılabilir.

Bu değişkenleri kodlarımda hiç kullanmadım ve bu tür kural ihlalleri olduğu için kullanmayacağım. Onlarla birlikte başka hangi "tuzakların" gizlendiği bilinmemektedir.

 

BİR PROBLEMİM VAR ....

Terminal ayarlarında posta kurduğumda, SMTP'de - smtp.gmail.com:25 kullanıyorum

Bir hata alıyorum - Posta: 530 5.7.0 Önce bir STARTTLS komutu vermeli. l3sm2329679fan.0
 
drknn :

Referans alıntılama:

Ve statik değişkeni nerede başlattık? bir alt programda. Başlatma kuralı ihlal edildi - ihlal edildi.

init() işlevi çağrılmadan önce, statik değişken ne bildirilmiş ne de alt programdan çağrılmıştır. İşte burada kafa karışıklığı ortaya çıkıyor. Başlatma bloğundan önce statik bir değişkenin başlatılması olmadığından, tek seferlik kural, program yapısının belirli bir bölümüne bağlı olduğu için gücünü kaybeder. Referansın konusu bu. Ancak, enfeksiyon söylenenleri yapmıyor - bir kerelik kuralın gücünü kaybetmesine rağmen yeniden başlatma hala gerçekleşmiyor!

Ayrıca öğreticide, bir kez başlatıldığının açıkça görüldüğü bir statik değişken kullanma örneği de vardır, aksi takdirde onay sayacı çalışmaz.

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