Hatalar, hatalar, sorular - sayfa 2707

 
Sergey Dzyublik :

Geliştiricilerden ( @İlyas ) keşfedilen kusura dikkat etmelerini rica ediyorum.
MT5 hatası (derleme 2377), bir işaretçi türü argümanı için uygun bir aşırı yüklenmiş işlev seçerken, temel sınıf yerine ana sınıfa bir işaretçiye tür dökümü olan işlev daha öncelikli hale gelir.
Ayrıca, temel sınıfa bir işaretçi üst sınıfa bir işaretçi atandığında derleme zamanı hatasının olmaması.

Bu hatayla ilgili olası kusur: https://www.mql5.com/ru/forum/1111/page2682#comment_15591437

 class A{};
class B : public A{};
class C : public B{};


struct T{
   static void test(A*){
       printf ( "A*" );
   }
   static void test(C*){
       printf ( "C*" );
   }
};

struct TT{
   static void test(B*){
       printf ( "B*" );
   }
};

void OnStart (){
   B b;
   T::test(&b);             // Runtime Error: Incorrect casting of pointers.   Expected result: printf ( "A*" );
   
   A a;
   TT::test(&a);           // Runtime Error: Incorrect casting of pointers.   Expected result: Compilation Error
   B* ptr = &a;             // Runtime Error: Incorrect casting of pointers.   Expected result: Compilation Error
}

Mesaj için teşekkürler.

düzeltildi

 Runtime Error: Incorrect casting of pointers.   Expected result: printf ( "A*" );


Olduğu gibi kalır - bu kod, şablon uzmanlığının bir sonucu olarak elde edilebilir (çalışmayacak, ancak derlemeyi etkileyecek bir bölümde).

 Runtime Error: Incorrect casting of pointers.   Expected result: Compilation Error
Runtime Error: Incorrect casting of pointers.   Expected result: Compilation Error
 
Roman :

Evet, gerçekten de kodunuzda başlık 443 numaralı bağlantı noktasına değil, 80 numaralı bağlantı noktasına döndürülür.
Kodunuzu tekrar inceledim ve orada SocketTlsHandshake işlevini görmedim.
Kodunuz el sıkışma üretmiyor. Belki de durum bu.
Bu işlev için yardım, bağlantı 443 numaralı bağlantı noktasına giderse gerekli olmadığını söylese de.

Aynen, bu benim kodum değil, geliştiricilerin örneğinden (MQ soketleri, bazen forumda bulunan bazı sezgisel olmayan özelliklere sahiptir, bu yüzden standart örneğe döndüm). SocketTlsHandshake'i denedim - her koşulda her zaman false döndürür ve sorunları çözme üzerinde hiçbir etkisi yoktur. Sertifika verileri döndürüldüğünden, el sıkışma gerçekleşir. Başlık bile, uzunluğuna bakılırsa gelir, ancak MQL koduna döndürülmez. Hata kodu çok geneldir ve hatanın gerçekliği şüphelidir. İçeriden bir bakış gerekiyor.
 
Stanislav Korotky :
Aynen, bu benim kodum değil, geliştiricilerin örneğinden (MQ soketleri, bazen forumda bulunan bazı sezgisel olmayan özelliklere sahiptir, bu yüzden standart örneğe döndüm). SocketTlsHandshake'i denedim - her koşulda her zaman false döndürür ve sorunları çözme üzerinde hiçbir etkisi yoktur. Sertifika verileri döndürüldüğünden, el sıkışma gerçekleşir. Başlık bile, uzunluğuna bakılırsa gelir, ancak MQL koduna döndürülmez. Hata kodu çok geneldir ve hatanın gerçekliği şüphelidir. İçeriden bir bakış gerekiyor.

Bağlantı başlangıçta güvenliyse ("https://" veya 443 veya 465 numaralı bağlantı noktası) SocketTlsHandshake işlevini kullanmanıza gerek yoktur.

İşlev özel durumlarda/protokollerde kullanılır

 
Ilyas :

Bağlantı başlangıçta güvenliyse ("https://" veya 443 veya 465 numaralı bağlantı noktası) SocketTlsHandshake işlevini kullanmanıza gerek yoktur.

İşlev özel durumlarda/protokollerde kullanılır

Ben de kullanmıyorum. Sorunu yeniden oluşturacak kod ektedir.

 
Stanislav Korotky :

Ben de kullanmıyorum. Sorunu yeniden oluşturacak kod ektedir.

SocketTlsRead'i SocketTlsReadAvailable ile değiştirin

 
Ilyas :

SocketTlsRead'i SocketTlsReadAvailable ile değiştirin

Daha fazla ayrıntı verebilir misiniz? Belge örneği, SocketTlsRead'i kullanır. SocketTlsReadAvailable neden orada kullanılmadı?

Bir işlev ne zaman kullanılmalı ve diğeri ne zaman kullanılmalıdır?

Hem güvenli hem de güvenli olmayan bağlantılar için uygun bir soketten okumayı engellemek için evrensel kod nasıl yazılır - benzer bir SocketReadAvailable işlevimiz yok, değil mi?

not. Değiştirilen işlev. Hata ortadan kalkmadı. Güncellenen kodu ekliyorum. GetLastError 0 döndürür.

Dosyalar:
 

Görsel test cihazında, CopyTicksRange işlevinin göstergesinden gelen çağrı 4014 hatasıyla (ERR_FUNCTION_NOT_ALLOWED) sona erer.

Aynı gösterge aynı cihazda çevrimiçi olarak iyi çalışıyor. Amaç ne? Test cihazında bu fonksiyon yasaklansın mı? Yardımda bundan hiç söz edilmedi.

 
Stanislav Korotky :

Görsel test cihazında, CopyTicksRange işlevinin göstergesinden gelen çağrı 4014 hatasıyla (ERR_FUNCTION_NOT_ALLOWED) sona erer.

Aynı gösterge aynı cihazda çevrimiçi olarak iyi çalışıyor. Amaç ne? Test cihazında bu fonksiyon yasaklansın mı? Yardımda bundan hiç söz edilmedi.

Gerçek kene testi mi?

 
Stanislav Korotky :
Aynen, bu benim kodum değil, geliştiricilerin örneğinden (MQ soketleri, bazen forumda bulunan bazı sezgisel olmayan özelliklere sahiptir, bu yüzden standart örneğe döndüm). SocketTlsHandshake'i denedim - her koşulda her zaman false döndürür ve sorunları çözme üzerinde hiçbir etkisi yoktur. Sertifika verileri döndürüldüğünden, el sıkışma gerçekleşir. Başlık bile, uzunluğuna bakılırsa gelir, ancak MQL koduna döndürülmez. Hata kodu çok geneldir ve hatanın gerçekliği şüphelidir. İçeriden bir bakış gerekiyor.

Evet, SocketTlsHandshake olmadan sertifikanın iade edilmesine de şaşırdım.
Ve SocketTlsHandshake işleviyle bir hata veriyor.
Davranışta bir tür bariz olmayan mantık.

 if ( SocketConnect (socket, Address, Port, 5000 ) && SocketTlsHandshake (socket, Address))
Can't connect to echo.websocket.org:443, error 5274

UPD:
İlyas'ın tavsiyesini gördüm.
Evet, bu fonksiyon olmadan bağlantıda herhangi bir problem olmaz.
Sorun okumaktır.
 
Ilyas :

SocketTlsRead'i SocketTlsReadAvailable ile değiştirin

Ayrıca SocketTlsReadAvailable ile değiştirmeyi denedim

 int rsp_len; 

if (ExtTLS)
   rsp_len = SocketTlsReadAvailable (socket, rsp, len); 
   //rsp_len = SocketTlsRead(socket, rsp, len);
else
   rsp_len = SocketRead (socket, rsp, len, timeout);

Davranış, SocketTlsRead ile aynıdır  

UPD:
Aynı sorun, SocketTlsHandshake'i farklı bir bağlantı noktasında kullanırken de var.