Hatalar, hatalar, sorular - sayfa 96

 

Kafam karıştı, bana kimin bildiğini söyle.

Bir yapı yarattı, onu verilerle doldurdu, bir dizi yapı yarattı.

Şimdi bir diziyi işleve ancak yapının yalnızca bir öğesi için nasıl aktarabilirim????????????????

 struct Str
  {
   int                a;
   int                b;
                     Str(){a= 2 ;b= 3 ;};
                    ~Str(){};
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
Str srt[ 10 ];
void OnStart ()
  {
   Print ( "sum a=" ,OnStr(srt[].a));??????????????????
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnStr( const Str &x[].y)?????????????????????
  {
   int sum= 0 ;
   for ( int i= 0 ;i< 10 ;i++)
     {
      sum+=x[i].y;
     }
   return (sum);
  }
 

Geliştiricilere bir öneri , mümkünse yapılar üzerinde standart işlemler yapmak güzel olur

böyle değil:

 struct Str
  {
   int                a;
   int                b;
                     Str(){a= 2 ;b= 3 ;};
                    ~Str(){};
  };
Str x;
Str y;
void OnStart ()
  {
   x.a+=y.a;
   x.b+=y.b;   
  }

ama şöyle:

 void OnStart ()
  {
   x+=y;     
  }
yapıların kopyalanması küçük bir mesele bırakılmıştır.
 
Urain :

Kafam karıştı, bana kimin bildiğini söyle.

Bir yapı yarattı, onu verilerle doldurdu, bir dizi yapı yarattı.

Şimdi bir diziyi işleve ancak yapının yalnızca bir öğesi için nasıl aktarabilirim????????????????


Mümkün değil. Evet ve gerek yok.

Çünkü - toplama işlevinde tam olarak o öğeyi kim engeller ve özetler?

İşte "koşer" olarak düzeltilen kod:

 struct Str
  {
   int                a;
   int                b;
                     Str(){a= 2 ;b= 3 ;};
                    ~Str(){};
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
Str srt[ 10 ];
void OnStart ()
  {
   Print ( "sum a=" ,OnStr(srt));??????????????????
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnStr( const Str &x[])?????????????????????
  {
   int sum= 0 ;
   for ( int i= 0 ;i< 10 ;i++)
     {
      sum+=x[i].y;
     }
   return (sum);
  }

OnStr() işlevinin içindeki for döngüsünde 10 değil, yalnızca ArraySize() gibi bir şey kullanılmalıdır. Ve "sum+=x[i].y"deki y yerine, yapıda tanımlanan gerçek veri alanı toplanır (örneğin, a veya b).

 
Urain :

Yapılar üzerinde standart işlemler yapmanın güzel olup olmayacağı geliştiricilere bir öneri

böyle değil:

ama şöyle:

yapıların kopyalanması küçük bir mesele bırakılmıştır.

C++ buna sahiptir. Buna "operatör aşırı yüklemesi" denir. Nasıl çalışması gerektiği programcı tarafından ilgili fonksiyon kullanılarak belirlenir.

Ancak Renat bu özelliği'e hayır dedi. Şans yok, değil mi?

 
simpleton :

Mümkün değil. Evet ve gerek yok.

Çünkü - toplama işlevinde tam olarak o öğeyi kim engeller ve özetler?

İşte "koşer" olarak düzeltilen kod:

OnStr() işlevinin içindeki for döngüsünde 10 değil, yalnızca ArraySize() gibi bir şey kullanılmalıdır. Ve "sum+=x[i].y"deki y yerine, yapıda tanımlanan gerçek veri alanı toplanır (örneğin, a veya b).

Her zaman olduğu gibi, örnekler verdiğimde özü uçup gitti ama her şeye şaşırmıyorum, muhtemelen kemik dilim suçlu.

Ve işin özü, aritmetik ortalamanın bir fonksiyonunu yazmak ve daha sonra yapının her bir üyesi için aritmetik ortalamanın yapısını elde etmek için bir dizi yapıyı bu fonksiyona geçirmektir.

Bir örnek basitlik için sonuçlandı, ancak muhtemelen başarısız oldu. Ama yine de, açıklama için teşekkürler.

Görünüşe göre geliştiricileri "operatör aşırı yüklemesine" izin vermek için gerçekten çekiçlemeniz gerekiyor.

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

Pekala, sadece iki yapıyı toplamak, çarpmak, bölmek için bir sürü yöntem yazmam gerekti,

en iğrenç şey, diğer yapıların tüm bunları yeni bir şekilde yazmak zorunda kalacak olmasıdır.

PS , yöntemlerin yanı sıra, bunun karşılığında çalıştığımız takajazha yapısı olan yapıların türünü verir ve böylece iç içe çağrı geçiş yapmaz ???

sonuç önce geçici bir yapıda saklanmalı ve ardından sonraki işlemeye aktarılmalıdır. bunun neden yapıldığı belli değil.

PPS , tüm parametreler sabit olmasına rağmen, var olmayan bir değişkende değişiklik olma şansı yoktur.


PPPS ve çöp yapılar, var olmayan bir yapıya atıfta bulunabileceğiniz için referans olarak iletilir (görünüşe göre dinlenme zamanı).

 
int sl_pips = SymbolInfoInteger ( _Symbol , SYMBOL_TRADE_STOPS_LEVEL );
Yanlış yorum "tür dönüşümü nedeniyle olası veri kaybı "? (Yapı: 305)
Документация по MQL5: Основы языка / Типы данных / Приведение типов
Документация по MQL5: Основы языка / Типы данных / Приведение типов
  • www.mql5.com
Основы языка / Типы данных / Приведение типов - Документация по MQL5
 
Urain :

Kafam karıştı, bana kimin bildiğini söyle.

Bir yapı yarattı, onu verilerle doldurdu, bir dizi yapı yarattı.

Şimdi bir diziyi işleve ancak yapının yalnızca bir öğesi için nasıl aktarabilirim????????????????

 struct Str
  {
   int                a;
   int                b;
                     Str(){a= 2 ;b= 3 ;};
                    ~Str(){};
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
Str srt[ 10 ];
void OnStart ()
  {
   Print ( "sum a=" ,OnStr(srt[].a));??????????????????
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnStr( const Str &x[].y)?????????????????????
  {
   int sum= 0 ;
   for ( int i= 0 ;i< 10 ;i++)
     {
      sum+=x[i].y;
     }
   return (sum);
  }

basit :

Mümkün değil. Evet ve gerek yok.

Çünkü - toplama işlevinde tam olarak o öğeyi kim engeller ve özetler?

İşte "koşer" olarak düzeltilen kod:

OnStr() işlevinin içindeki for döngüsünde 10 değil, yalnızca ArraySize() gibi bir şey kullanılmalıdır. Ve "sum+=x[i].y"deki y yerine, yapıda tanımlanan gerçek veri alanı toplanır (örneğin, a veya b).

İki seçenek var (anladığım kadarıyla):

1. Ek parametrelerle çalışacağımız kaydın dizinini belirterek diziyi dizinin kendisini iletin.

Bu durumda, boyut dizisinin taşmasını kontrol etmek gerekir ve fonksiyon bildirimi şöyle görünecektir...

OnStr( const Str &x[], int Index=- 1 )

2. Sırasıyla bir kayıt boyutunda ikincil bir diziyi geçiyoruz, işlevin sonucunun izlenmesi ve işlenmesi ile ilgili tüm çalışmalar, işlev çağrısı noktasında gerçekleştirilir.

İşlev bildirimi daha sonra şöyle görünürdü ...

OnStr( const Str &x[ 1 ])
Документация по MQL5: Операции с массивами / ArrayRange
Документация по MQL5: Операции с массивами / ArrayRange
  • www.mql5.com
Операции с массивами / ArrayRange - Документация по MQL5
 
EvgeTrofi :
Yanlış yorum "tür dönüşümü nedeniyle olası veri kaybı "? (Yapı: 305)

Sonucu açıkça int'ye çevirmelisiniz.

 int sl_pips = ( int ) SymbolInfoInteger ( _Symbol , SYMBOL_TRADE_STOPS_LEVEL );

not

Çalışan bir örnek burada görülebilir - OrderSend ()

Ama anladığım kadarıyla prensipte bu uyarıya gözlerinizi kapatabilirsiniz...

 

Karşılığında çok parantez varsa - kafanız karışmaya başlar!?

Örneğin burada, "klsfd Adım 2" gibi bir dizeden bir sayı döndüren bir işlev verilmiştir:

 int GetStep( string text){
   string Right;
   int U = StringFind (text, "Step " );
   int End, result;
   if (U>= 0 ){
      U=U+ 5 ;
      Right = StringSubstr (text, U);
      End = StringFind (Right, "." );
      result= int ( MathRound ( StringToDouble ( StringSubstr (text, U, End-U))));
       return (result);
   }
   return ( 0 );
}

Bundan farkı nedir?

 int GetStep( string text){
   string Right;
   int U = StringFind (text, "Step " );
   int End;
   if (U>= 0 ){
      U=U+ 5 ;
      Right = StringSubstr (text, U);
      End = StringFind (Right, "." );
       return ( int ( MathRound ( StringToDouble ( StringSubstr (text, U, End-U)))));
   }
   return ( 0 );
}

İkinci seçenek derleme sorunlarına neden olurken, ilk seçenek oluşturmaz.