'Koşullu Dallanma - 'GoTo' Kluge ? - sayfa 2

 
RaptorUK :
GOTO'ları BBC Basic günlerinde kullandım. . . Hatta BBC BASIC'i tam zamanlı işimde yaklaşık 7 yıl kullandım. . . BBC Basic'te bile GOSUB ve RETURN vardı, böylece alt programlar (fonksiyonlar) kullanılabilirdi. . . neden MQL4'te bir GOTO'ya benzeyen herhangi bir şey kullanmak isteyesiniz ki? belki ihtiyacınızı açıklayabilirsiniz?

Merhaba Raptor,

Kendin de söylediğin gibi, bu tür şeyleri yıllarca kendin kullandın ve bu nedenle kullanılabileceği çok kullanışlı olan sayısız durumun farkındasın. 'GoSub' ve 'Return' işlevleri temelde bahsettiğim 'GoTO' ile aynı fikirdir. GoSub/RETURN işlevlerine rağmen, çağıran programda aynı noktaya dönülmelidir. Çok berbat kabuslar yaratmayan 'GoTo'nun aksine. MQL'deki Include, Library ve .dll dosya kullanım kapasitesi sanırım buna benzer. Ancak bu, GoSub/RETURN vb. ile elde edilebilecek türden bir kontrole izin vermez.

Bilgisayarlı işleme için programlamanın birçok yinelemesi GoSub/RETURN çiftlerini de içerir ve bu ortamda oldukça faydalıdır. Çok sayıda programda yüksek derecede modülasyona ve çok sayıda standart 'hazır döngü'nün yanı sıra özel ve özel işlevlerin tekrar tekrar kullanılmasına izin verir. Her ihtiyaç duyulduğunda tekerleği sürekli olarak 'yeniden icat etmek' zorunda değilsiniz. Sözleşmeli bilgisayarlı işleme programlaması yapmaya başladığımda, 2.000'den fazla farklı CNC kontrol cihazı ile karşılaştım: hepsinin programlamada kendi varyasyonları var )< 8) Bu beni çok pahalı olan CAD-CAM yazılımını kullanmaya zorladı ki bu çok kötüydü. Yazılımın üreteceğinden daha iyi takım aşınması ile daha kısa döngü süresinde daha iyi sonuçlar veren çok daha iyi ve daha verimli olanları kendim yazabiliyordum.

 

GOSUB/RETURN, MQL4'teki işlevleri kullanmakla aynıdır

Yıllar önce biraz CNC programlama yaptım. . . AeroSpace esas olarak çalışır.

 
FourX :

C'de olduğunu sanmıyorum, değil mi?

Evet öyle. K & R ikinci baskının 65. sayfasındadır. Kitapta kullanmadıklarını SÖYLÜYORlar , sonraki sayfada örnekler verirler!

 

Bence burada taklit etmeye çalıştığımız şey

dog:

cat:

mouse:

   if ( bizarre_condition1 ){
       goto cat;
   }

   if ( bizarre_condition2 ){
       goto mouse;
   }

   goto dog:

Hangisi böyle yapılabilir...

 while ( true ){
   
   // dog:
   if ( GOTOstate == DOG ){
   }
   
   // cat:
   if ( GOTOstate == DOG || GOTOstate== CAT ){
   }
   
   // mouse:
   //no test needed here, just do MOUSE stuff
   
   
   if ( bizarre_condition1 ){
      GOTOstate= CAT;
       continue ;
   }

   if ( bizarre_condition2 ){
      GOTOstate= MOUSE;
       continue ;
   }
   
   GOTOstate = DOG;
}
   

ama çok zarif değil, özellikle birçok etiket için. Daha iyi bir yol

 while ( true ){
   
   switch (GOTOstate){
       case DOG:
         // do DOG stuff
         // break;   // do NOT use the break so you get deliberate FALL-THROUGH
       case CAT:
         // do CAT stuff
         // break;   // do NOT use the break so you get deliberate FALL-THROUGH
       case MOUSE:
         // do MOUSE stuff
         break ;
       default :
         break ;     
   }
   
   if ( bizarre_condition1 ){
      GOTOstate= CAT;
       continue ;
   }

   if ( bizarre_condition2 ){
      GOTOstate= MOUSE;
       continue ;
   }
}

ancak switch deyimine gerçekten fonksiyon çağrıları koymanız gerekir, aksi takdirde switch birkaç kod sayfasının üzerinden geçerse kodun yapısını göremezsiniz.

 
FourX :

Merhaba SDC,

Çoğu programlamada olduğu gibi, MQL4, bazı satırların üzerinden atlamak dışında neredeyse tüm 'İşlevler'dir, bir MQL4 EA içinde nasıl yapacağımı bulmaya çalıştığım gerçek bir 'Git' işlevine sahip değildir Bu yüzden emin değilim Neye katılıyorsunuz ve bu arama bağlamında neyi kastediyorsunuz ve neyi kastediyorsunuz? Lütfen genişletin ve açıklayın. Tartışmacı olmamak. Aklınızda bir şey var gibi görünüyor ve bunun ne olduğunu ve bize nasıl faydalı olabileceğini bilmek istiyorum.


Merhaba FourX Önceki gönderileri yanlış okudum, birinin zaten söylediğini sanıyordum, işlev çağrısı GoTo fikrini aşıyor ve işlenebilirliğini iyileştiriyor, çünkü daha sonra işlevler halinde organize edildiğinde kodu okumak daha kolay olduğu için. bu GoTo'yu takip etmektir ve aceminin örneğinde gösterdiği gibi, anahtarı kullanarak çok yollu dallanma, birden çok GoTo ile aynı şeyi başarabilir.

 
dabbler :

Bence burada taklit etmeye çalıştığımız şey

Hangisi böyle yapılabilir...

ama çok zarif değil, özellikle birçok etiket için. Daha iyi bir yol

ancak switch deyimine gerçekten fonksiyon çağrıları koymanız gerekir, aksi takdirde switch birkaç kod sayfasının üzerinden geçerse kodun yapısını göremezsiniz.


Merhaba Dabbler,

Gerçek bir 'GoTo' ifadesi/işlevi, bir sonraki (birkaç) İfadeyi / İfadeyi atlamakla kalmayıp, program içinde HERHANGİ BİR yere atlamanıza izin verir. Bu, bir programda birden fazla durumda ihtiyaç duyulan aynı işlevlerin yeniden kullanılması gibi şeylere izin verir.

Dolayısıyla hem esnekliği hem de rahatlığı. Bahsettiğim gibi, iki ucu keskin bir kılıçtır, çünkü bu, başınızı belaya sokmayı çok kolaylaştırabilir ve kabus gibi programlar hazırlayabilir.

MQL5'te 'GoSub/RETURN', 'GoTo' vb. gibi bir şey var mı? Peki ya Visual Basic, Java, PHP vb?

 
RaptorUK :

GOSUB/RETURN, MQL4'teki işlevleri kullanmakla aynıdır

Yıllar önce biraz CNC programlama yaptım. . . AeroSpace esas olarak çalışır.

Şu ana kadar Raptor'u çözebildiğim kadarıyla, GoSub / Return komutları veya MQL4'te böyle bir işlev yapma yeteneği gibi bir şey değil. Bu nedenle, bu kapasiteyi gerçekleştirmek için MQL4'te bir kluge bulmaya çalışıyorum.

 
dabbler :

Bence burada taklit etmeye çalıştığımız şey

Hangisi böyle yapılabilir...

ama çok zarif değil, özellikle birçok etiket için. Daha iyi bir yol

ancak switch deyimine gerçekten fonksiyon çağrıları koymanız gerekir, aksi takdirde switch birkaç kod sayfasının üzerinden geçerse kodun yapısını göremezsiniz.

MQL4 Başvurusu - Temel Bilgiler - MQL4'ün sözdizimi, bazı özelliklerin dışında, daha çok C benzeri bir sözdizimidir:

  • adres aritmetiği yok;

  • hiçbir operatör ... süre;

  • operatör yok ...;

  • [koşul]?[ifade 1]:[ifade 2] işlemi yok;

  • bileşik veri türleri (yapılar) yok;

  • karmaşık görevler imkansızdır; örneğin, val1=val2=0; dizi[i++]=val; koşul=(cnt=Sipariş Toplamı)>0; vb.;

  • mantıksal bir ifadenin hesaplanması her zaman tamamlanır, asla erken sonlandırılmaz.

 

Merhaba 1withZachy,

Özünde bu, gerçekten sadece standart veya özel bir işlevi kullanan ve ardından sonucu MQL4'ün yaptığı gibi işleve 'döndüren' MQL4 SOP'dir. Akış şemasına göre, gözden kaçırdığım ince bir ayrım olsa da, öyle olduğunu düşünmüyorum. Ne yazık ki, sağlanan örnek koddaki belgeler: 'CallFuntion.mq4', Rusça'da ve ben hiç anlayamıyorum.

 

Wikipedia'da GoTo ile ilgili ilginç bir makaleden bazı alıntılar:

Birçok dil goto deyimini destekler ve çoğu desteklemez. Java'da goto ayrılmış bir kelimedir , ancak kullanılamaz. [ 1 ] [ 2 ] PHP'de 5.3 sürümüne kadar goto için yerel destek yoktu (işlevselliğini taklit etmek için kitaplıklar mevcuttu). [ 3 ]

Yapılandırılmış program teoremi , program yazmak için goto ifadesinin gerekli olmadığını kanıtladı; Sıralama, seçim/seçim ve tekrar/yinelemeden oluşan üç programlama yapısının bir kombinasyonu, bir Turing makinesi tarafından gerçekleştirilebilen herhangi bir hesaplama için yeterlidir.

1960'lar ve 1970'ler, bilgisayar bilimcilerinin " yapılandırılmış programlama " paradigması lehine GOTO ifadelerinden uzaklaştığını gördü. Bazıları [ hangisi? ] programlama stili kodlama standartları, özellikle yukarıda bahsedilen yapılandırılmış program teoremi açısından GOTO ifadelerinin kullanılmasını yasaklar. Böhm-Jacopini ispatı , yazılım geliştirme için yapılandırılmış programlamanın benimsenip benimsenmeyeceği sorusunu çözmedi, çünkü kısmen inşaatın bir programı geliştirmekten çok gizlemesi daha olasıydı.

Muhtemelen GOTO'nun en ünlü eleştirisi, Edsger Dijkstra'nın , Zararlı Olarak Kabul Edilen Açıklamaya Git adlı 1968 tarihli mektubudur. [ 5 ] Dijkstra bu mektupta, programların (özellikle döngüleri içerenlerin) doğruluğunu analiz etme ve doğrulama görevini karmaşıklaştırdıkları için, sınırlandırılmamış GOTO ifadelerinin daha yüksek seviyeli dillerden kaldırılması gerektiğini savundu.

Alternatif bir bakış açısı, Donald Knuth'un birçok yaygın programlama görevini analiz eden ve bazılarında GOTO'nun kullanılacak en uygun dil yapısı olduğunu bulan, Git İfadeleri [ 6 ] ile Yapılandırılmış Programlama'da sunulmaktadır.

Neden: