Hatalar, hatalar, sorular - sayfa 453

 
Interesting :

Dinamik nesneler yaratmayın - şimdi ve bu nesnelerle ilgili diğer her şeyi kullanmak zorunda kalmayacaksınız (Doğru, o zaman fazla bir şey yapamazsınız).

Görünüşe göre, şimdinin ne anlama geldiğini değil, dinamik nesnelerle çalışmanın ne anlama geldiğini anlamak istiyorum ...

/////////////////////////////////// METİNİMDEN DAHA ÇIKIYORUM (ÇIKAMAM TEKLİF) :) //////////////////////////////////////// /// /////////////

OnStart() geçersiz
{
//---
primer nesne;
obekt.f1();
}
//+------------------------------------------- --------------------+
sınıf astarı
{
halka açık:
geçersiz f1();

astar();
};

astar:: astar()
{
Alert("Sanırım burada da başlatma sadece oluşturma anında yapılıyor");
};

astar::f1()
{
uluslararası[];
ArrayResize(l,3);
l[0]=87;
l[1]=67;
l[2]=57;
ArrayResize(l,5);
l[3]=47;
l[4]=37;
Alert(l[0]," ",l[1]," ",l[2]," ",l[3]," ",l[4]);
};

Böyle bir kod hata vermez ve dizi dinamiktir. Niye ya????

Ve onu yok etmek istiyorsanız:

{

primer nesne;
obekt.f1();


}

Görünüşe göre C++ almışlar, işi adreslerle bozmuşlar ve MQL'ye sokmuşlar.

 

220Volt :

DAHA FAZLA BENİM METİNİM (ALIT VERMEDEN KIRMAYALIM) :)

Böyle bir kod hata vermez ve dizi dinamiktir. Niye ya????

1. Ve neden bir hata ile yürütülmeli???

a) Nesne otomatik olarak oluşturulur (bu, OnStart'ta bir nesne örneği bildirme yönteminden kaynaklanır) ve otomatik olarak silinir

 primer  obekt1;   //Конструктор будет вызван автоматически уже на этой строчке
primer *obekt2; //Указатель на динамический объект

void OnStart ()
{
obekt2 = new primer; //Конструктор выполняется вот тут 

obekt.f1();

delete (obekt2); //Тут выполняется деструктор (отсутствие delete приведет к утечки памяти в момент завершения работы скрипта)
}

Nesnelere gelince, örnekleri otomatik veya dinamik olarak oluşturulabilir. İlk durumda, kurucu genellikle başlatma sırasında, ikinci durumda, yalnızca yeni operatörü kullandıktan sonra yürütülür.

b) f1()'de de, şeylerin mantığına göre, hiçbir hata olmamalıdır (kişisel olarak farklı bir uygulama yapmama rağmen).

Dinamik dizilere gelince. Statik olanlardan farkları, bu tür dizilerin önceden bilinen bir boyutu olmamasıdır; bu, böyle bir diziyle çalışmadan önce ArrayResize kullanılarak belirtilmesi gerektiği anlamına gelir (yeni boyut dizinin ilk boyutunda belirtilir). Dizi öğelerinin 0'dan itibaren numaralandırıldığına dikkat etmek önemlidir.

2. Dinamik nesnelerle çalışmakla ilgileniyorsanız, bu örneği dikkatlice inceleyin - Teetris (eski forumda ne yaptığını hala anlayamasam da) ...

 

Araya girdiğim için özür dilerim, gerçekten anlamak istiyorum. Vizyonumu belirteceğim, neyi yanlış yapıyorum ???

C++ girişine bakıldığında (bir primer sınıfımız ilan edildi)

astar *gösterge=yeni astar;

ukazatel'in, nesnemizin depolandığı bellekteki adresi, primer sınıfının bir kopyasını içerdiğini söylüyor. Adresler MQL'den kaldırıldı ve ukazatel nesne tanımlayıcısını içeriyor. Bu bize ne veriyor? Fark ettiğim tek fark, bloğun içinde new aracılığıyla bir nesne bildirirlerse ve blok tamamlanmadan önce silmeyi kullanmayı unuturlarsa, nesne yalnızca program sona erdiğinde silinir. Ve bloktan çıktıktan sonra, bu nesne ile tanımlayıcı aracılığıyla bağlantı kaybolacaktır.

new aracılığıyla bildirilirse, nesnenin belleğinin dinamik olarak ayrıldığını (yani boyutunu artırma yeteneğine sahip olduğunu) ve yeni olmadan nesnenin yalnızca statik değişkenlere sahip olabileceğine dair bir fikrim vardı. Ancak benim varsayımım doğrulanmadı (daha önce yayınladığım komut dosyası, nesne yeni aracılığıyla bildirilmedi, ancak dinamik bir değişkenle ilgileniyor).

Ve şimdi, tüm bu tutkulardan sonra, çok güzel bir durumda değilim ve yeni ile onsuz arasındaki farkın ne olduğunu hiç anlamıyorum ??? Ve derleyici orada bir şeyi düzeltirse, neden uğraşayım ki ???

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

Hatta belgelerde anlatılana benzer bir şey yapmaya çalıştım (yeni hakkında bir şeyler öğrenmek için):

anahtar(5)

{

durum 5: m_shape= yeni CTetrisShape1; // bu seçenek hiç dönmez (ve bu belgelerden !!!) sadece bu şekilde

( m_shape= yeni CTetrisShape1; )

}

ve şimdi m_shape.___ nesnesine erişemiyoruz, bir hata atılacak

 

220Volt :

Ve şimdi, tüm bu tutkulardan sonra, çok güzel bir durumda değilim ve yeni ile onsuz arasındaki farkın ne olduğunu hiç anlamıyorum ??? Ve derleyici orada bir şeyi düzeltirse, neden uğraşayım ki ???

Nesne örnekleri, yeni if operatörü kullanılarak dinamik olarak oluşturulur (bu yüzden sizden Tetris örneğine bakmanızı istedim):

1. Nesne örneklerinin sayısı önceden bilinmez (ancak her zaman birden fazla olacağı varsayılır);

2. Aynı ataya sahip "rengarenk" nesneler için bir işaretçi dizisi oluşturmanız gerekiyorsa;

3. Nesnenin (veya daha doğrusu bu nesneye yönelik bir işaretçinin) bir prosedür veya işlev için parametre olarak kullanılacağı varsayılırsa (kütüphaneye iletmek gerekebilir);

4. Programın farklı yerlerinde bir nesne ile (bu nesneye bir işaretçi ile okuyun) çalışmanız gerekiyorsa. Örneğin, bir ve aynı "düzen" nesnesi şunlarda bulunabilir: bir uzman tarafından oluşturulan bir dizi sipariş; belirli bir sembol için sipariş dizisi; belirli bir pozisyonu oluşturan bir dizi emir ve daha birçok yerde.

5. Dinamik olarak oluşturulmuş yeminler ve onlara işaretçiler kullanılarak çözülen daha birçok görev vardır.

 
220Volt :

Hatta belgelerde anlatılana benzer bir şey yapmaya çalıştım (yeni hakkında bir şeyler öğrenmek için):

................................

ve şimdi m_shape.___ nesnesine erişemiyoruz, bir hata atılacak

Aslında, Tetris örneğinde, bu şekilde uygulanmaktadır (sizin durumunuzda break ifadesinin eksik olduğunu unutmayın)

   switch (nshape)
     {
       case 0 : m_shape= new CTetrisShape1; break ;
       case 1 : m_shape= new CTetrisShape2; break ;
       case 2 : m_shape= new CTetrisShape3; break ;
       case 3 : m_shape= new CTetrisShape4; break ;
       case 4 : m_shape= new CTetrisShape5; break ;
       case 5 : m_shape= new CTetrisShape6; break ;
       case 6 : m_shape= new CTetrisShape7; break ;
     }

Aynı zamanda, NULL eşitlik işaretçisini kontrol etmeyi unutmayın.

 if (m_shape!= NULL )
 {
//С указателем можно работать
 }
 

yardım için teşekkürler
 

geliştiriciler

Lütfen test cihazında çalışmayan veya belirli özelliklerle çalışan her şeyi "açık formda" belgelerde belirtin (böylece gereksiz sorular olmaz).

Örneğin, yerel saat ve GMT saati (sunucu saatine eşittir) ile çalışmanın özelliklerini ve TimeGMTOffset'ten beklenen sonucu almanın zorluğunu açıkça belirtmelisiniz.

 

Kim bilir - bir Unicode karakter dizisini bir dizgeye çevirmenin normal bir yolu var mı?

 
TheXpert :

Kim bilir - bir Unicode karakter dizisini bir dizgeye çevirmenin normal bir yolu var mı?

Bana öyle geliyor ki dizinin her bir öğesini ayrı ayrı çevirmem gerekecek.
Документация по MQL5: Основы языка / Переменные
Документация по MQL5: Основы языка / Переменные
  • www.mql5.com
Основы языка / Переменные - Документация по MQL5
Neden: