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

 
FourX :

Ş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.

Bir işlev GOSUB/RETURN ile aynı şeyi yapar. . .

start()
  {
   Print ( "About to call a function called, a_function . . ." );
  a_function();                                               //  GOSUB
   Print ( "Just returned from a function called, a_function" );
   return ( 0 );
  } 
   
   
   
void a_function()
   {
   Print ( "a_function has been called . . . " );
   return ;                                           // RETURN
   }
   
   
   
 
RaptorUK :

Bir işlev GOSUB/RETURN ile aynı şeyi yapar. . .

Sayısız standart ve özel işlevin herhangi bir (uygun) spot Raptor'da 'çağrılabileceğinin' ve kullanılabileceğinin farkındayım, ancak bunların MQL4'te GoSub ve/veya GoTo gibi programdaki GoTo Line 185 veya GoTo Line 185 veya sizin tanımladığınız gibi belirli bir Etiket/fonksiyon vb . Sonra çalıştırın ve programda çağrıldığı noktaya geri dönün; veya belki de o alt rutinin koşullu sonucuna bağlı olarak AltRoutine ve/veya program bölümü/İşlev olarak adlandırılandan devam edin. Belirttiğiniz gibi, GoSub'ı yıllarca kendiniz kullandınız ve birkaç ardışık kod satırından koşullu bir atlama yapmak hiç de aynı şey değil. Aynı işlevi hiç yerine getirmediğini zaten bildiğimiz bu ayrımı tartışmaya devam etmek istemiyorum. Böylece bu gönderi. Örnek olarak belki de programda daha önceki bir noktaya atlayan ve her seferinde tekrar tekrar kodlamak yerine programda zaten kurulmuş olan aynı gerekli işlevi yeniden kullanan gerçek bir 'GoSub'ı nasıl kullanacağımızı hala çözebilmiş değiliz. gereken zamandır.

Bilginize: MetaEditor, içine metin kopyaladığım zamanın yaklaşık %85'inde çöküyor. Bu, MT4'ün BİRÇOK farklı örneğinde ve çok sayıda farklı bilgisayarda ve 3 farklı pencere sürümündedir. MQL4'ü kullandığım 32 ve 64 bit sistemleri dahil etmeden. MT4 iyi, MQL4 editörü değil. Bu yüzden kopyalayıp yapıştırmak benim için gerçekten uygulanabilir bir seçenek değil. Öyle olsa bile, bu yine de bir 'GoSub' veya GoTo'nun sunduğu kapasiteleri sunmaz.

 

Bunun gerçekten bir anlamı var mı? mql4'ün mql4 olduğu bir gerçektir, bu nedenle mql4'te kod yazarken mql4'ü düşünmeniz gerekir, farklı yapıları destekleyen başka bir dilde nasıl çözeceğinizi düşünürken bir dilde kodlamaya çalışmanın bir anlamı yoktur. Eğer mql4'te yalnızca GoSub/Return ve GoTo'nun kullanımıyla çözülebileceğini düşündüğünüz bir kodlama sorununuz varsa, bunu görmek isterim, çünkü bir kedinin derisini yüzmenin her zaman birden fazla yolu olduğunu bulacağınızı düşünüyorum.

 

FourX :

Öyle olsa bile, bu yine de bir 'GoSub' veya GoTo'nun sunduğu kapasiteleri sunmaz.

Üzgünüm, bir MQL4 işlevi ve bir GOSUB'un herhangi bir şekilde farklı olduğu konusundaki bakış açınızı anlamakta gerçekten zorlanıyorum. (Goto, diğer bir su ısıtıcısıdır.)

Şu Gosub olayına bağlı kalalım. Bir MQL4 işlevi bir alt programdır. Bir değer döndürebilir veya döndürmeyebilir. Tüm alt program çağrıları, çağrıldıkları yerden ana kodda bir sonraki satıra döner. Bu konuda Raptor'a %100 katılıyorum.

(SDC'nin yukarıdaki bakış açısına da katılıyorum).

 

İpliğin while noktası, program içinde HERHANGİ BİR YERDE veya hatta diğer programlardan harici olarak koşullu dallanma yapmanın mümkün olup olmadığını görmektir. daha önce belirtilenler: fGoTo, fGoSub. MQL4'ün bunları doğrudan sağlamadığını zaten biliyorum. Bu iş parçacığının bütün amacı budur: Bu işlevi gerçekleştirmek için bir 'çözüm (AltRoutine?)' vb. yapmak mümkün müdür ? Kavramsal olarak bunun MQL4'teki 'include' dosyalarıyla da benzerlikleri vardır.

GetLastError() işlev değerlerinin 'Uyarı' veya 'Yazdırılması' yoluyla MQL4 hata ayıklayıcısının sınırlı kapasitelerini telafi etmek için hepimizin kullandığı geçici çözüme benzer.

Bu, if, while, döngü, devam, dönüş vb. gibi bir dizi koşullu boolean içeren normal MQL4 işlevlerine hiç benzemiyor; herhangi bir programlama modülünün/fonksiyonunun tekrar tekrar kullanılabileceği diğer ortamlardan verilen örnekler gibi yetenekler, genellikle programın (çok) önceki bölümlerinden. Bir kez beyan edin: kullanım, çoğunlukla programın içinde, zaten sağlanan işlevsellik için ihtiyaç duyulan başka herhangi bir yerde zaman aşımına uğrayabilir. Bazı ortamlardaki fGoSub , kullanıcıların bu tür diğer fSubRoutine'leri, genellikle belirli bir işlevi yerine getiren modüller olan ayrı küçük programlardan almalarına ve kullanmalarına olanak tanır. Belki biraz MQL4'ün 'Include' dosyalarına benzer.

Şu anda orada olmaması, bunun için bir 'çözüm' oluşturabiliyorsak, bu güçlü programlama işlevini kullanmamamız gerektiği anlamına mı geliyor?

Hepimizin bildiği gibi, aynı sonucu elde etmek için bir şeyi programlamanın sayısız yolu vardır. Bu, 'Bana probleminizi gösterin, size bunu fGoTo veya fGoSub olmadan nasıl yapacağınızı söyleyeyim' durumu değildir. Şunlardan biridir: EĞER işlevselliği yaratabilirsek, o zaman birçok farklı durumda birçok farklı şekilde kullanabileceğimiz bu ek programlama esnekliğine ve kapasitesine sahibiz.

 

mql4'te özel bir işlevin ne olduğunu anladığınızı sanmıyorum. . . belki bir mql4 özel işlevinin tam olarak tanımladığınız şeyi yapmadığına dair bir örnek verebilirsiniz? Bence öyle. . . Diğer birçok EA'da, Göstergelerde ve Komut Dosyalarında yeniden kullandığım birçok işlevim var.

start()'ı program olarak düşünün. . başlangıç içinde herhangi bir yerden özel bir işlev çağırabilirim. . . işlev tamamlandığında program, özel işlevin çağrıldığı satırdan sonraki satıra döner. . . tıpkı bir GOSUB gibi.

 

FourX :

İpliğin while noktası, program içinde HERHANGİ BİR YERDE veya hatta diğer programlardan harici olarak koşullu dallanma yapmanın mümkün olup olmadığını görmektir. daha önce belirtilenler: fGoTo, fGoSub.

Herhangi bir programlama modülünün/fonksiyonunun tekrar tekrar kullanılabileceği diğer ortamlardan verilen örnekler gibi yetenekleri sağlamaya çalışıyorum, genellikle programın (çok) önceki bölümlerinden.

Mql4 eski tarz bir dildir, seviyesi yaklaşık 1990'dır. Ama sizin goto ve gosub'unuz daha da eski yapılardır, yaklaşık 1970'lerden. Programlama stilinizi mql4'ten daha eski yapmanın amacı nedir? Dll-s aracılığıyla C# gibi gerçek bir programlama dili kullanmak çok daha iyi. 1990'lar ve 2000'lerdeki icatların çoğu (sınıf, arayüz, nesne, olay ve dinleyici gibi tasarım kalıpları, teste dayalı programlama gibi programlama yöntemleri vb.) kod tekrarını önlemek ve yeniden kullanılabilir, güvenilir ve okunabilir kodları hızlı bir şekilde yazmanıza yardımcı olmak içindir. Bence tüm bu goto projesini unutmalısın.
 
FourX :

Sayısız standart ve özel işlevin herhangi bir (uygun) spot Raptor'da 'çağrılabileceğinin' ve kullanılabileceğinin farkındayım, ancak bunların MQL4'te GoSub ve/veya GoTo gibi programdaki GoTo Line 185 veya GoTo Line 185 veya sizin tanımladığınız gibi belirli bir Etiket/fonksiyon vb . Sonra çalıştırın ve programda çağrıldığı noktaya geri dönün;

bir işlevin içindeki dönüş, işlevin çağrıldığı yere dönmesini sağlar. Eski gosub/return'ün %100 ikamesidir. ve ayrıca işlev, değerlerin iletilmesine ve değerlerin döndürülmesine izin verir, hatta kendi ad alanlarına ve yığın çerçevesine sahiptirler, bu nedenle artık global değişken karmaşasına da gerek yoktur. Sorununuzu gerçekten anlamıyorum. Lütfen gerçekten yapmak istediğiniz şeyin somut bir örneğini (belki sözde kodda veya BASIC'te) sağlayın ve size aynı örneğin if/else, switch/ durum ve işlev çağrıları.

Gerçekten eksik olan tek şey istisnalardır. İstisnaları simüle etmeye mi çalışıyorsunuz? Bunu GOTO ile de yapamazsınız, ayrıca bunu yaparken çağrı yığınına uygun şekilde bakmanız (ve çözmeniz) gerekir.

Aynı işlev içinde birden fazla dönüş ifadesine sahip olabilirsiniz ve ayrıca döngüleri break ile kırabilirsiniz, bu yapılandırılmış bir dilde bir GOTO'ya alabileceğiniz en yakın şeydir ve bu şeyler (birden çok çıkış) zaten bazı katı kurallar tarafından kaşlarını çattı. püristler de.

 
erzo :
Dll-s aracılığıyla C# gibi gerçek bir programlama dili kullanmak çok daha iyi.

Bu düz düşük seviyeli C çağırma kuralı API'si ile etkileşime giren DLL'ler oluşturmak için C# önerilmez. Diğer C# ve çeşitli microsoft öğeleriyle etkileşim kurmak istiyorsanız C# mükemmeldir, ancak diğer ortamlar kadar genel bir amacı yoktur. Çok uzmanlaşmış.

Modern bir programlama dilinde C-çağırma kurallarıyla kolayca arayüz oluşturan DLL'ler yapmak istiyorsanız, ObjectPascal (Free Pascal) veya Delphi'yi öneririm.

 
7bit :

Bu düz düşük seviyeli C çağırma kuralı API'si ile etkileşime giren DLL'ler oluşturmak için C# önerilmez.

Java'yı daha iyi biliyorum ve kullanmayı düşündüm ama köprü yapmak zor. Ama daha kolay olacağını düşündüğüm C#'ı önermezseniz, yine de java'yı deneyeceğim. (Pascal benim tarzım değil.) Tavsiyen için teşekkürler!