Hatalar, hatalar, sorular - sayfa 1034

 
TheXpert :
Aslında bu mantıklı çünkü yazılanlar biraz hayal gibi görünüyor.
C++ öyle düşünmüyor. Ve saçmalık hakkında - bu, konunun özünü ortaya çıkarmak için en basitleştirilmiş örnektir.
 
A100 :
C++ öyle düşünmüyor.

Evet, C++ pek çok şeyi saymaz, ancak mesele şu ki, statik üyeler başlatıldıkları sırayla değil, bildirildikleri sırayla başlatılabilirler.

Bununla ilgili standardı içmek gerekir.

Документация по MQL5: Основы языка / Объектно-ориентированное программирование / Статические члены класса
Документация по MQL5: Основы языка / Объектно-ориентированное программирование / Статические члены класса
  • www.mql5.com
Основы языка / Объектно-ориентированное программирование / Статические члены класса - Документация по MQL5
 

Çok fazla yalvardım - const transfer etmedim - şimdi gördüğünüz gibi her şey açık - bir sabit bir diğeri tarafından başlatılıyor:

 class A {
protected : //если заменить на public: то все работает
        static const int s1;
         static const int s2;
};

const int A::s1 = 0x1 ;
const int A::s2 = A::s1; //ошибка компиляции

Derleyici bir hata olarak s1 üyesinin güvenliğine işaret eder. Korumalıyı public ile değiştirirseniz, her şey saat gibi çalışır. Ancak güvenliğin doğası gereği başlatma sırası, atama sırası veya belirli bir değerle başlatma yeteneği ile ilgisi yoktur.

 
TheXpert :

Bununla ilgili standardı içmek gerekir.

Genel durumda, derleyicinin derleyiciden farklı olduğuna ve çözülmesi gerektiğine katılıyorum.

Başka bir örnek

 enum _ENUM { en = 0x1 };
const int cc = 0x2 ;
static int s_array1[] = { cc }; //ошибка
static int s_array2[] = { en }; //нормально

class A {
public :
         static const int s;
         static int Array[];
};
const int A::s = 0x3 ;
int A::Array[] = {
        en,     //нормально
        A::s,   //ошибка
        cc       //ошибка
};

Burada MQL derleyicisi diziyi const int değeriyle başlatmak istemiyor (enum - geçer)

Yine, C++'ın bunu kopyaladığı ve doğru şekilde başlattığı gerçeğine itiraz ediyorum.

Документация по MQL5: Операции с массивами / ArrayInitialize
Документация по MQL5: Операции с массивами / ArrayInitialize
  • www.mql5.com
Операции с массивами / ArrayInitialize - Документация по MQL5
 
Muhtemelen arama dizisinde bir hata
 class A {
public :
        A * operator <<( int x ) { Print ( x ); return ( GetPointer ( this )); }
        A * operator <<( string s ) { Print ( s ); return ( GetPointer ( this )); }
};

int f( int & x ) { return ( x = 4 ); }

void OnStart ()
{
         Print ( "" );
        A a;
         int x = 3 ;
        a << "(1)" <<   "(2)" << "(3)" ; // Результат: (1) (2) (3) //нормально
        a <<  x   << f( x ) <<  x;   // Результат:  4   4   3 ??? как же так?
}
İkinci durumda, sonuç bekleniyordu: öncekine benzer şekilde 3 4 4. Bazı türlerin bir arama dizisine sahip olması ve diğerleri için bir başkasının olması normal değildir.
 
A100 :
Muhtemelen arama dizisinde bir hata
C++'da, bir ifadenin işlenenlerinin değerlendirilme sırası UB'dir. Neden burada belirli bir siparişe güveniyorsun?
 
TheXpert :
C++'da, bir ifadenin işlenenlerinin değerlendirilme sırası UB'dir. Neden burada belirli bir siparişe güveniyorsun?
bir yerde gördün mü
 cout << "Hello " << "word" ;

"Merhaba kelimesi" olarak çıktı mı?

Bu durumda, string türü için her şeyin normal şekilde görüntülenmesine rağmen, int türü için aşırı yüklenmiş operatör için olan budur.

Ayrıca, C++'ın bununla hiçbir ilgisi yoktur. Diyelim ki kod yazdınız

f(); // a << x;
g(); // a << f( x );
h(); // a << x;
Ve sizin için, bu işlevler ters sırada veya genel olarak farklı argüman türleri için - keyfi bir sırayla yürütüldü.
 
Bu arada, soldan sağa kaydırma işlemlerinin sırası, MQL5'in kendisinde de tanımlanmıştır, bu örnekle onaylanmıştır:
 void OnStart ()
{
         int a = 0x1 ;
         int b = a << 2 << a;   //b = 8
         int c = (a << 2 ) << a; //c = 8
         int d = a << ( 2 << a); //d = 16
         Print ( "b=" , b, ", c=" , c, ", d=" , d );
}
 

Selamlar!

'Geçersiz işaretçi erişimini' düzeltmeye yardımcı olun.

OnInit() içinde:

SymbolsCollection = new CSymbolsCollection();
SymbolsCollection.RefreshRealSymbols();

CSymbolsCollection::RefreshRealSymbols() yönteminin CleanSymbolsArray(myRealSymbols);

Bu yöntem ve değişken sınıfta şu şekilde bildirilir:

 public :
   CSymbol* myRealSymbols[];
   void CleanSymbolsArray(CSymbol* &inArray[]);

Sorun şu ki, RefreshRealSymbols() , CSymbolsCollection yapıcısında çağrıldığında düzgün şekilde yürütülür.

Ancak, SymbolsCollection .RefreshRealSymbols(); OnInit() içinde; sebep olur:

invalid pointer access in 'SymbolsCollection.mqh' (55,22)

Hata, CSymbolsCollection::RefreshRealSymbols() yönteminin gövdesindeki CleanSymbolsArray(myRealSymbols); satırına işaret ediyor. , konum, açılış parantezinden hemen sonradır.

Herhangi bir fikir?

 
vlad_123 :
...

Herhangi bir fikir?

değil mi ?