Hatalar, hatalar, sorular - sayfa 1016

 
A100 :

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.

;-)

 
MetaDriver :

Söylenti, sana ne? Eğer bir sır değilse.

Sadece MQL5'te satır içi işlevler (formda) yoktur ve bunların yerine parametrik makrolar kullanıyorum, bu genel olarak tamamen doğru değil, çünkü tür kontrolü yok
 
A100 :
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! :)

 

MetaDriver :

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.

Ve ben hız için değil, rahatlık için. Aslında, satır içi olabilirler, ancak formda değiller (!). .mqh'de satır içi tanımlarsanız ve ardından bunu birkaç .ex5'te kullanırsanız zorluklar ortaya çıkar. linki bulmaya çalışacağım

https://www.mql5.com/ru/forum/1111/page1013#comment_520221

 int B() { return ( A( 0 ) ); }

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

 
A100 :

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.

 
A100 :

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.
 
MetaDriver :
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 :)

 
A100 :

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?

Kendisi cevap verdi:


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?

Orada satır içi normaldir. Buradaki sorun, B()'nin ötekiliğinde değil, yeniden tanımlanmasındadır. Her ikisi de bir DLL olduğundan, içerdiği kapsayıcılarla ilgili bilgiler (adları) 1.mqh'nin yeniden derlenmesi sırasında zaten eksiktir (ilk derleme lib'nin oluşumu sırasındaydı), bu nedenle kapsayıcı derlendiğinde, yeniden tanımlanmış ayrıca B() işlevi algılanır, ayrıca parametreler aynı olduğundan, derleyici bunu işlevi yeniden yüklemek için hatalı (yanlış) bir girişim olarak kabul eder. Her hakkı var. Çok kibar, kaba bir dil gönderebilirdim.
 
MetaDriver :
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.

 
A100 :
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).

Neden: