Hatalar, hatalar, sorular - sayfa 1016
Alım-satım fırsatlarını kaçırıyorsunuz:
- Ücretsiz alım-satım uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Kayıt
Giriş yap
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
Hesabınız yoksa, lütfen kaydolun
Evet, teşekkürler, kaynak kodunu basitleştirirken bir hata yaptım - şimdi hatayı farklı bir şekilde yeniden yazdım
Karışıklığı önlemek için öncekini silindi.Bu korkunç. Gerçekten yemin ediyor. Ne korkunç bir hayat...
--
Söylenti, sana ne? Eğer bir sır değilse.
Lisp'te bir danışman yazıyor musunuz? Elbette şapkamı çıkarıyorum ama yine de Haskell'e geçmenizi tavsiye ediyorum.
;-)
Söylenti, sana ne? Eğer bir sır değilse.
Sadece MQL5'te satır içi işlevler (forma göre) yoktur ve bunun yerine parametrik makrolar kullanıyorum.
Evet, ben de kullanıyorum. Sadece böyle korkunç bir yuvalama değil. )))
Başvuru için: mql5, tüm küçük işlevleri satır içi ikamelere çevirir. Başka bir deyişle, "satır içi" anahtar sözcüğünün varsayılan olarak her kullanıcı tanımlı işlevde olduğunu varsayabiliriz.
Bir makroyu değiştirme veya bir işleve derleme kararı nihayetinde derleyici tarafından verilir (bu arada, tıpkı C++ gibi). Dolayısıyla herhangi bir şeyi bu şekilde hızlandırmaya çalışmanın bir anlamı yok, tüm basit işlevler zaten sıralanmış durumda.
// Ve bu arada - tip kontrolü ile! :)
Başvuru için: mql5, tüm küçük işlevleri satır içi ikamelere çevirir. Başka bir deyişle - "satır içi" anahtar sözcüğünün varsayılan olarak her kullanıcı tanımlı işlevde olduğunu varsayabiliriz.
https://www.mql5.com/ru/forum/1111/page1013#comment_520221
Orada, 1.mqh'deki B(), olduğu gibi satır içi olmalıdır - ama hepsi birlikte - normal olarak derlenmez - yalnızca ayrı olarak. ServiceDesk, çağrının belirsizliğine atıfta bulunarak, sorunun özüne derinlemesine girmedi ve projenin farklı bir şekilde düzenlenmesini önerdi. Başka nasıl? Her şey yalnızca B() uygulamasını .mqh'den .ex5'e kaldırırsanız çalışır. Ve sonra satır içi şeklinde nedir?
Bu arada, MQL4'te bu örnek çalışır - hatasız, ancak B() özünde satır içi değil, formda - satır içi
Ve ben hız için değil, rahatlık için. Aslında, satır içi olabilirler, ancak formda değiller (!).
Ve sana bir form verdi.
"Studebaker kim? Bu kuzenin Studebaker mı? Baban Studebaker mı?" (c) Ostap Ibragimych
.mqh'de satır içi tanımlarsanız ve ardından bunu birkaç .ex5'te kullanırsanız zorluklar ortaya çıkar.
Komplikasyon yok. Mantıksal hatalar yapmazsanız ve derleyicinin nasıl çalıştığını doğru anlarsanız. // Özel olarak değil, genel olarak. Anlamak için genel ilkeler.
linki bulmaya çalışacağım
https://www.mql5.com/en/forum/1111/page1013#comment_520221
Burada, özünde, B () işlevi satır içi
"Aynı parametrelerle aşırı yüklenmiş işleve belirsiz çağrı" gibi hatalardan kurtulamadım, bunlar yalnızca ayrı bir .ex5'e yerleştirildiğinde ortaya çıkmadı.
Kaynak kodu düzeyinde temelde tanınmayan bir özyinelemeniz var. Derleyici hala esasen size bağırdı. Bir lib'i, derlemekte olduğunuzla aynı içermenin tanımlandığı içermeye bağlamaya çalışıyorsunuz. Peki, ne istedin? Bir derleyici olsaydınız, ne yapardınız?
Bu sizin için bir haber olabilir, ancak bir DLL'de yazılmış bir satır içi işlev , bu DLL'nin dışında bir makro olarak kullanılamaz. // Kaynak kodu artık çalışma zamanında mevcut değil
Görünüşe göre sizin için ikinci haber: mql(4, 5) içindeki tüm lib'ler dinamik olarak bağlantılı. Bu aslında DLL'dir.
Toplamda elimizde: aslında ikisinden de kendinize dönmeye, kendinize dönmeye, kendinize dönmeye çalıştınız ...... vb.
Katılıyorum, hepsi itiraz etmeden derlenirse çok daha kötü olurdu ve daha sonra lib'in yürütülmesi sırasında bellek tükenene kadar kendini tekrar tekrar yüklemeye çalışırdı .... :))
?
Bu nedenle C/C++ satır içi anahtar kelimeye sahiptir.
Bu yüzden hiç değil. Bağlantıdaki örneğin C++ ile derlenmeyeceğinden eminim.
// Kontrol etmek için çok tembel. Bu sadece mantıksız. Özyinelemeli olarak organize edilmiş bir kaynağın nasıl oluşturulacağı bana açık değilse, derleyici de anlamayacaktır.
Bu arada, MQL4'te bu örnek çalışır - hatasız, ancak B() özünde satır içi değil, formda - satır içi
inanmıyorum. Her ne kadar .. yeniden yükleme işlevi olmadığından, derleyici size yanlış bir yeniden yükleme ima etmeye çalışmıyor olabilir - aptalca tekrarlanan tanımları yok sayar.
B()'den önce satır içi yazarsanız hem MQL4 (!) hem de C/C++ ile derlenir.
Hiç bir özyineleme yok, aslında var
int A( int ) ve #define B() A( 0 )
orada her şey çok basit - tembellik değilse - taze bir zihne bakın - sadece işlevlerin bildirimini ve uygulamasını ayırın :)
Orada, 1.mqh'deki B(), olduğu gibi satır içi olmalıdır - ama hepsi birlikte - normal olarak derlenmez - yalnızca ayrı olarak. ServiceDesk, çağrının belirsizliğine atıfta bulunarak, sorunun özüne derinlemesine girmedi ve projenin farklı bir şekilde düzenlenmesini önerdi. Başka nasıl?
Her şey yalnızca B() uygulamasını .mqh'den .ex5'e kaldırırsanız çalışır. Ve sonra satır içi şeklinde nedir?
Kendisi cevap verdi:
Orada satır içi normaldir. Buradaki sorun, B()'nin başkalığında değil, yeniden tanımlanmasındadır.
Oldukça doğru - sadece C/C++ bunun tekrarlanan bir tanım olmadığını anlıyor (satır içi anahtar kelime aracılığıyla), ancak MQL5 anlamıyor, ancak derlenmiş modülün adı ile #import'ta belirtilen adı ayırt edebilse de. MQL4'ün nasıl anladığını bilmiyorum.
Kısacası, bir işlevin uygulamasını .mqh'de tanımlamak ve herhangi bir .ex5'te sorunsuz kullanmak imkansızdır.
Oldukça doğru - sadece C/C++ bunun yeniden tanımlama olmadığını anlıyor, ancak MQL5 - anlamıyor
С/С++ bunu YALNIZCA statik bir lib derlerken anlayabilir. Kaynak adlarıyla ilgili bilgiler nesne dosyasına kaydedildiğinden (tam olarak yeniden derleme tanıma için).
Dinamik olarak bağlantılı bir kitaplıkla bu numara çalışmayacaktır. Ve eğer öyleyse, bunun nedeni yeniden derleme tanıma değil, geçerli kaynaktaki ve DLL'deki adların eşleşmesi durumunda "öncelik kurallarının" varlığıdır. Bazı dillerde bu tür kurallar tanımlanmıştır (özellikle Delphi'de, bazı C/C++ derleyicilerinde de mümkündür).