Hatalar, hatalar, sorular - sayfa 2521

 

fxsaber :
Подскажите, как в C++  с этим? Задумался, использовать эту фишку в своем коде или нет. Если в C++ работает, буду использовать. Нет - вряд ли, т.к. могут отменить в следующих билдах.

b = a; 
a = b; // OK

İlk atama yalnızca MQL'de çalışır. Ve işe yaraması çok kötü. Sonunda bu yanlış anlaşılmayı iptal etmek istiyorum. İkincisi ile - sorun değil.

 
Alexey Navoykov :

İlk atama yalnızca MQL'de çalışır. Ve işe yaraması çok kötü. Sonunda bu yanlış anlaşılmayı iptal etmek istiyorum. İkincisi ile - sorun değil.

Garip. İlkinin çalışması gerektiğini düşündüm ve ikincisi - hayır.

 
fxsaber :

Garip. İlkinin çalışması gerektiğini düşündüm ve ikincisi - hayır.

Görünüşe göre, MQL geliştiricileri de atamanın özünü tam olarak anlamıyor. Çünkü onlara bu sorunu uzun zamandır anlatıyorum, ama duvara yaslanmış bezelye gibi.

Atamanın özü, bir nesneye eşdeğer bir nesnenin atanmasıdır. Onlar. aynı tip. Bu, doğru nesnenin önce örtük olarak sol nesnenin türüne dönüştürüldüğü ve ardından atamanın (kopyalamanın) gerçekleştiği anlamına gelir. Ve ilk durumda, böyle bir döküm (A->B) doğal olarak imkansızdır. C++'da bir hata olacaktır. Ancak MQL'de bunun yerine, soldaki nesne sağa dönüştürülür ve b nesnesinin yalnızca bir kısmı değiştirilerek A::operator=(A&) yürütülür. Bu bir görev mi?

Bir long'a bir int atadığınızı, ancak yalnızca ilk dört baytın değiştirildiğini ve geri kalanına dokunulmadan kaldığını hayal edin. İşte aynı şey.

 
Alexey Navoykov :

Bir long'a bir int atadığınızı, ancak yalnızca ilk dört baytın değiştirildiğini ve geri kalanına dokunulmadan kaldığını hayal edin. İşte aynı şey.

Yani uygun, bir nevi. Tabii ki yapılar bağlamında.

 
fxsaber :

Yani uygun, bir nevi. Tabii ki yapılar bağlamında.

Evet, şüpheli kolaylık. Belki bir satırdaki karakterleri kaydeder, ancak rastgele hataların kaynağıdır ve kodun anlaşılmasını zorlaştırır / bozar. Yukarıda belirtildiği gibi, eşittir işareti, nesnenin tamamen değiştiği açık ve net bir anlama sahiptir. Bu nedenle, bu durumda operatör amacına uygun olarak kullanılmaz. Böyle standart dışı bir davranış istiyorsanız, operatörü bu amaçlar için aşırı yüklemelisiniz.

ps Yalnızca B sınıfının kendi alanları yoksa bir istisnaya izin veririm, yani. A sınıfı ile (tamamen eşdeğer) tamamen aynıdır, o zaman böyle bir atamayı önlemek için hiçbir neden yoktur. C++'da hala çalışmıyor olsa da, MQL'de buna izin verilebilir.

 
Slava :

Opt dosyasında, tüm girdi parametrelerinin yazıldığı parçada, optimize edilmiş parametrelerin değeri (boyut ve ofset alanları aracılığıyla belirlenir) Value (optimizasyon olmadan olduğu gibi) değil, Start içerir.

Değer varsa mantıklıdır.

 
Alexey Navoykov :

Görünüşe göre, MQL geliştiricileri de atamanın özünü tam olarak anlamıyor. Çünkü onlara bu sorunu uzun zamandır anlatıyorum, ama duvara yaslanmış bezelye gibi.

Atamanın özü, bir nesneye eşdeğer bir nesnenin atanmasıdır. Onlar. aynı tip.

Özel türler için işlemlerin özü önceden belirlenmemiştir. Ve yalnızca sıraları tanımlanır, bu durumda uygun operatörün çağrılmasından oluşur=

MQL'de, C++'dan farklı olarak operatör= miras alınır, bu nedenle b = a; A::operator=(const A&);

Genel olarak, burada çelişki yoktur. Eşdeğer bir nesne atama özel durumunda, varlıklar arasında belirli bir tutarsızlık vardır, ancak başka bir şey yoktur.

 
A100 :

MQL'de, C++'dan farklı olarak operatör= miras alınır, bu nedenle b = a; b.operator=(const A&); çağrısına eşdeğerdir.

Evet, sorun bu. Ama yazı farkı burada bir rol oynamaz. C++'da her iki durumda da derlenmeyecektir.

Genel olarak, burada çelişki yoktur. Eşdeğer bir nesne atama özel durumunda, varlıkların belirli bir tutarsızlığı vardır.

Çelişki en azından With ++ ile olacaktır. Bu derlenirse, sağ işlenen dolaylı olarak sola çevrilir ve ardından nesne tamamen değiştirilir. Mantıksal olarak nasıl çalışması gerekir. int-> long ile bir örnek verdim. Ve bir nesnenin iç kısımlarının bir kısmının ikamesi bir atama değildir. Bu nedenle, her şey birdir: hem çelişki hem de tutarsızlık.

ps B::operator=(A&) operatörü yine de aşırı yüklenebilse de, aklı başında bir programcının orada B nesnesini kısmen değil tamamen değiştireceğine inanıyorum. Çünkü ödevin özü budur.

Herhangi biri kısa ve öz yazmak isterse, bunun için başka bir operatör yapılabilir: örneğin &= veya |=. En azından yaygın olarak kullanılmazlar, bu yüzden onları karıştıramazsınız.

 
Alexey Navoykov :

.........

Çelişki en azından With ++ ile olacaktır. ......

.........

MQL'nin C++ ile tamamen uyumlu olması gerektiği fikrini nereden aldınız ???

C-benzeri hiç eşdeğer anlamına gelmez!

MQL oldukça özel görevler için tasarlanmıştır ve üzerinde oluşturulduğu dili tamamen kopyalamak zorunda değildir.

Belki sinirlenmeyi bırakırsın?

Ama Pascal'da .........

Ve montajcıda...

Ve Java'da ....

Ve Temelde...

Burada dilleri karşılaştırma alıştırması yapıyor musunuz?

=======

not Ben sadece senin için değilim...

 
Сергей Таболин :

MQL'nin C++ ile tamamen uyumlu olması gerektiği fikrini nereden aldınız ???

...

Burada dilleri karşılaştırma alıştırması yapıyor musunuz?

Belirli bir cümleye cevap veriyordum. Boşver. Kediotu içip yatağa git, endişelenmen senin için kötü. ... Ama bazı insanlar için "C ++" kelimesinde yanar )