Hatalar, hatalar, sorular - sayfa 2198

 
fxsaber :

Fark yok


Girdiğinizde, ortaya çıktığı gibi, hangi sayıları yazdığınıza bağlıdır. Bazıları aramanıza izin vermiyor. Ve bir şey - izin verir.

Garip davranış... Sayının tamsayı kısmını 12 karakterden az yazarsanız, toplam sayıyı 14'ten fazla atlayabilirsiniz.

Geliştiricilerin yanıt vermesini bekleyelim.

 
Lütfen basit bir şey yapmama yardım et
 class A
{
public :  
   int i;
  
  A* operator *( const A &Value ) const
  {
    A* Res = new A;
    
    Res.i = this .i * Value.i;
    
     return (Res);
  }
};

void OnStart ()
{
  A a, b, c;
  
  a.i = 2 ;
  b.i = 3 ;
  c.i = 5 ;
  
  A* d = a * b * c;
  
   Print (d.i); // 30
  
   delete d;
}

Kod açıkça bir bellek sızıntısı olması gerektiğini gösteriyor. Ve olan da tam olarak bu. Ancak, nesneleri "çarpabilmeniz" için doğru şekilde nasıl yazılır? "*=" operatörü ile yapılarda olduğu gibi her şey açıktır. Ve sınıflarda bu basit işlevsellik nasıl uygulanır?


PS Ve bu kod

 class A
{
private :
  A Tmp;
  
public :
   int i;
  
  A* operator *( const A &Value )
  {
     this .Tmp.i = this .i * Value.i;
    
     return (&Tmp);
  }
};

void OnStart ()
{
  A a, b, c;
  
  a.i = 2 ;
  b.i = 3 ;
  c.i = 5 ;
  
  A* d = a * b * c;
  
   Print (d.i); // 30
}

ME'yi F7 ile çökertir ve Terminal'i F5 ile öldürür. Neden bu kadar şanslıyım?!

 
fxsaber :

PS Ve bu kod

ME'yi F7 ile çökertir ve Terminal'i F5 ile öldürür. Neden bu kadar şanslıyım?!

 class A
{
private :
  A Tmp;
  
public :
   int i;
  
  A* operator *( const A &Value )
  {
     this .Tmp.i = this .i * Value.i;
    
     return (&Tmp);
  }
};

void OnStart ()
{
  A a, b, c;
  
  a.i = 2 ;
  b.i = 3 ;
  c.i = 5 ;
  
  A* d = a * b * c;
  
   Print (d.i); // 30
}

Olası sonsuz özyineleme ve yığın taşması.

 
Sergey Dzyublik :

Olası sonsuz özyineleme ve yığın taşması.

Tabii ki sorun seçimde ama sebebi daha derin gibi görünüyor.

Ve çalışma zamanında, açıkçası, herhangi bir özyineleme olmamalıdır.

 
fxsaber :
Lütfen basit bir şey yapmama yardım et
 class A
{
public :
  A() {}
  A( const A& other) 
  {
   this .i = other.i;
  }
  
   int i;
  
  A operator *( const A &Value ) const
  {
    A Res;
    
    Res.i = this .i * Value.i;
    
     return (Res);
  }
};

void OnStart ()
{
  A a, b, c;
  
  a.i = 2 ;
  b.i = 3 ;
  c.i = 5 ;
  
  A d = a * b * c;
  
   Print (d.i); // 30
}
Elbette bir ek yükü olacak ama kolaylık daha önemliyse...
 
Комбинатор :
Elbette bir ek yükü olacak ama kolaylık daha önemliyse...

Teşekkür ederim! Nesnenin dönüşünün ve nesneyi tanımlarken "=" öğesinin eklentiden geçtiği ortaya çıktı. yapıcı.

Gerçekten bir yerde görsel bir tablo görmek isterim, bu durumlarda yapıcılara (ve hangilerine) ve hangi operatörlere çağrılar vardır. Şimdi her şey sezgi düzeyinde, ama elbette başarısız oluyor.

 
fxsaber :

Gerçekten bir yerde görsel bir tablo görmek isterim, bu durumlarda yapıcılara (ve hangilerine) ve hangi operatörlere çağrılar vardır. Şimdi her şey sezgi düzeyinde, ama elbette başarısız oluyor.

değere göre bir şey döndürürseniz, bu bir tanımsa veya değilse bir ifadeyse kopya oluşturucu (aynı türdeyse) aracılığıyla atanır.

 void OnStart ()
{
  A a, b, c;
  
  a.i = 2 ;
  b.i = 3 ;
  c.i = 5 ;
  
  A d = a * b * c;
   // код аналогичен A d(a * b * c);
   // будет вызван копи-конструктор.

  A e;
  e = a * b * c;
   // будет вызван оператор =
  // но копи-конструктор все равно нужен для множественного умножения
  
  Print (d.i); // 30
}
 
Комбинатор :

değere göre bir şey döndürürseniz, bu bir tanımsa veya değilse bir ifadeyse kopya oluşturucu (aynı türdeyse) aracılığıyla atanır.

Açıkça belirtilmiş, teşekkürler!


PS Kodunuzu yazdırdı

 class A
{
public :
  A() { Print ( __FUNCSIG__ ); }
  A( const A& other) 
  {
   Print ( __FUNCSIG__ );
   this .i = other.i;
  }
  
  ~A()
  {
   Print ( __FUNCSIG__ );
  }
  
   int i;
  
  A operator *( const A &Value ) const
  {
     Print ( __FUNCSIG__ );

    A Tmp;
    
    Tmp.i = this .i * Value.i;
        
     return (Tmp);
  }
};

void OnStart ()
{
   if ( true )
  {
    A a, b, c;
    
    a.i = 2 ;
    b.i = 3 ;
    c.i = 5 ;
    
    A d = a * b * c;

     Print (d.i); // 30
  }
  
   Print ( "Kill!" );  
}


Sonuç

 void A::A() // a
void A::A() // b
void A::A() // c
A A:: operator *( const A&) const
void A::A() // Tmp
void A::A( const A&) // return
void A::~A() // Tmp
A A:: operator *( const A&) const
void A::A() // Tmp
void A::A( const A&) // return
void A::~A() // Tmp
void A::A( const A&) // d
30
void A::~A() // a
void A::~A() // b
void A::~A() // c
void A::~A() // d
void A::~A() // return
void A::~A() // return
Kill!

Vurgulanan çizgiler soruları gündeme getiriyor. Geçici nesneler neden kullanıldıkları anda çökmedi? Onlar. otuzun sonuna kadar. Bu tür nesneler arabama çarpacak çünkü. on milyonlarca kene ile çalışması gerekiyordu. Her nesne gigabaytlarca RAM tüketecektir ve bu tür geçici nesnelere hemen sahip olmak yerine onları hemen öldürmek istemezsiniz.

 
fxsaber :

Vurgulanan çizgiler soruları gündeme getiriyor. Geçici nesneler neden kullanıldıkları anda çökmedi? Onlar. otuzun sonuna kadar.

genellikle geçici nesneler hemen değil, bağlamın sonunda silinir. C++'da yanılmıyorsam standartta yazıyor.

hızlı silmek istiyorsanız - bağlamı yönetin.

 void OnStart ()
{
   if ( true )
  {
    A a, b, c;
    
    a.i = 2 ;
    b.i = 3 ;
    c.i = 5 ;
    
    A d;
    {
      d = a * b * c;
    }

     Print (d.i); // 30
  }
  
   Print ( "Kill!" );  
}

Doğru, operatörü = yapmak zorundasın

 
A100 :

Yeni grafiğimde, yalnızca örneği yeniden başlattığımda (tüm düğmeler) çalıştı, ki bu kendi içinde anlaşılmaz. Ama şimdi açık

Ticaretin açılmasıyla belirtilen etki (yalnızca yeniden başlatıldığında) kayboldu

Belgelerde değişiklikler yapıldı. Kodla ilgili sorun, fare olaylarını almak için grafiğe bir komut göndermenin, komutu yalnızca grafiğin kuyruğuna koymasıydı. Ve bu sıra işlenmezse (örneğin, hafta sonları), grafik belirtilen olayları alamaz. ChartSetInteger açıklamasına not eklendi ve örnek düzeltildi:

Not

İşlev eşzamansızdır; bu, işlevin belirtilen çizelgede başarıyla kuyruğa alınan bir komutun yürütülmesini beklemediği, ancak hemen kontrolü döndürdüğü anlamına gelir. Özellik, yalnızca komut grafik kuyruğunda işlendikten sonra değişecektir. Komutları grafik kuyruğunda hemen yürütmek için ChartRedraw işlevini çağırın.

Aynı anda birkaç grafik özelliğini hemen değiştirmek istiyorsanız, ilgili işlevleri ( ChartSetString , ChartSetDouble , ChartSetString ) tek bir kod bloğunda çalıştırmanız ve ardından ChartRedraw'ı bir kez çağırmanız gerekir.

Yürütme sonucunu kontrol etmek için belirtilen grafik özelliğini sorgulayan bir işlev kullanabilirsiniz ( ChartGetInteger , ChartGetDouble , ChartSetString ). Bu fonksiyonların senkron olduğu ve yürütme sonucunu beklediği unutulmamalıdır.

Misal:

//+------------------------------------------- --------------------+
//| uzman başlatma işlevi |
//+------------------------------------------- --------------------+
geçersiz   OnInit ()
{
//--- grafik penceresinde fare hareketiyle ilgili mesajları etkinleştir
    ChartSetInteger (0, CHART_EVENT_MOUSE_MOVE ,1);
//--- grafik özelliklerinin zorunlu olarak güncellenmesi, olay işlemeye hazır olmayı garanti eder
    GrafikYeniden Çiz ();

}