Fragen zu OOP in MQL5 - Seite 95

 
Maxim Kuznetsov:

die GA ist eher eine Art "Modewort". Wie kann der Gray'sche Code zur Konvergenz beitragen? Nur theoretisch...

Sie könnten auch einfach zufällig mischen

ich sage nichts, ich glaube schon lange nicht mehr alles, was im Internet steht, ich versuche alles zu überprüfen

Hier ist ein funktionierender Konvertierungscode zu Gray's Code und zurück

//+------------------------------------------------------------------+
uint IntToGrey(const uint value) // https://e-maxx.ru/algo/gray_code
  {  return(value ^ (value >> 1)); }
//+------------------------------------------------------------------+
uint GreyToInt(const uint value) // https://e-maxx.ru/algo/gray_code
  {
   uint n = 0;
   for(uint g = value; g != 0; g >>= 1)
     {
      n ^= g;
     }
   return(n);
  }
//+------------------------------------------------------------------+
 
Und wie würde sich dies auf den genetischen Algorithmus auswirken? Der genetische Algorithmus sollte nicht auf Werte reagieren, wenn er rein genetisch ist. Wenn eine zusätzliche Mittelwertbildung oder ein Gradientenabstieg verwendet wird, kann dies Auswirkungen haben. In diesem Fall ist es jedoch besser, das Problem auf direktem Wege zu lösen, d. h. den Parameter durch das Array zu filtern und das Array zu mischen. Der Wert des optimierten Parameters aus dem Eigenschaftenfenster ist ein Index des Array-Elements, und der Wert aus dem Array wird im Expert Advisor selbst verwendet. Dann kann der Optimierer ausgetrickst werden. Aber nur, wenn die Konvergenz durch Mittelwertbildung oder Gradientenabstieg erfolgt. Aber wenn es sich um einen reinen genetischen Algorithmus handelt, kann ich mir nicht vorstellen, was er nützen soll. Was soll das bringen? Woher wachsen die Beine?
 

gibt es diesen Code:

class A
{
private:
   const int _a;
public:
   A(const int a): _a(a) { Print(_a); }
};
//+------------------------------------------------------------------+
class B
{
private:
   const A a;
public:
   B(const int b): a(b) {}
};
//+------------------------------------------------------------------+
void OnStart()
{
   B b(3);// 3
}
//+------------------------------------------------------------------+

alles ist OK, aber ich brauche ein Array von A-Objekten, d.h. ich brauche es so:

class B
{
private:
   const A a[2];
public:
   B(const int b): a[0](b),a[1](b) {}  //'[' - member(s) initialization expected
                                       // 'a' - explicit initializer for arrays not allowed
};

Gibt es eine Möglichkeit, einen Konstruktor für ein Array von Objekten aufzurufen, ohne Zeiger zu verwenden?

 
Igor Makanu:

gibt es diesen Code:

alles ist OK, aber ich brauche ein Array von A-Objekten, d.h. ich brauche es so:

Gibt es eine Möglichkeit, einen Konstruktor für ein Array von Objekten aufzurufen, ohne Zeiger zu verwenden?

Nein. Nur durch Krücken.
 

Ist es für diesen Code möglich:

//+------------------------------------------------------------------+
struct LIST;
struct MyStruct
{
   double            d_data;
   int               i_data;
   MyStruct() {}
   MyStruct(const int i_v, const double d_v): d_data(d_v), i_data(i_v) {}
   LIST              operator+(MyStruct &value)
   {
      LIST result;
      ArrayResize(result.arr, 2, 10);
      result.arr[0] = this;
      result.arr[1] = value;
      return(result);
   }
   MyStruct          operator*(const double mult)
   {
      MyStruct result = this;
      result.d_data *= mult;
      return(result);
   }
};
//+------------------------------------------------------------------+
struct LIST
{
   MyStruct          arr[];
   LIST              operator+(MyStruct &value)
   {
      int last = ArraySize(this.arr);
      ArrayResize(this.arr, last + 1, 10);
      this.arr[last] = value;
      return(this);
   }
};
//+------------------------------------------------------------------+
void OnStart()
{
   MyStruct a(1, 1.11), b(2, 2.22), c(3, 3.33);
   LIST x = a + b + c * 2;
   ArrayPrint(x.arr);
//    [d_data] [i_data]
//[0]  1.11000        1
//[1]  2.22000        2
//[2]  6.66000        3
}
//+------------------------------------------------------------------+

für LIST eine Vorlage / Schablone zu erstellen ?

Beim ersten Mal hat es nicht geklappt (((.

 
Igor Makanu:

Ist es für diesen Code möglich:

für LIST eine Vorlage / Schablone zu erstellen ?

es hat beim ersten Mal nicht funktioniert ((.

dies. entfernen

UPD: hmm... Sie haben alles im Griff))))

UPD: Holen Sie sich das yum))))

//+------------------------------------------------------------------+
template<typename T>
struct LIST
{
   T          arr[];
   LIST<T>              operator+(T &value)
   {
      int last = ArraySize(arr);
      ArrayResize(arr, last + 1, 10);
      arr[last] = value;
      return(this);
   }
};
//+------------------------------------------------------------------+
struct MyStruct
{
   double            d_data;
   int               i_data;
   MyStruct() {}
   MyStruct(const int i_v, const double d_v): d_data(d_v), i_data(i_v) {}
   LIST<MyStruct>              operator+(MyStruct &value)
   {
      LIST<MyStruct> result;
      ArrayResize(result.arr, 2, 10);
      result.arr[0] = this;
      result.arr[1] = value;
      return(result);
   }
   MyStruct          operator*(const double mult)
   {
      MyStruct result = this;
      result.d_data *= mult;
      return(result);
   }
};
//+------------------------------------------------------------------+
void OnStart()
{
   MyStruct a(1, 1.11), b(2, 2.22), c(3, 3.33);
   LIST<MyStruct> x = a + b + c * 2;
   ArrayPrint(x.arr);
//    [d_data] [i_data]
//[0]  1.11000        1
//[1]  2.22000        2
//[2]  6.66000        3
}
 
Vladimir Simakov:

dies. entfernen

UPD: hmmm... Sie haben alles im Griff))))

UPD: fang das yum-yum)))

Danke! - Es funktioniert!

der Code ist minimalistisch, es funktioniert - ich will ein Array von Strukturen, Listen sind nicht immer bequem, alles funktioniert, ist es klar, dass Nicht-Standard-Situationen mit diesem Code simuliert werden kann, aber der Code ein Dutzend Zeilen

 

warum dieser Code keinen Compilerfehler verursacht , wenn er auf ein privates Feld einer anderen Person zugreift:

class A
{
private:
   int _value;
public:
  void set(const int value)      { _value = value;    }
  int  get()                     { return(_value);    }
  void set(A &a, const int value){ a._value = value;  }
};

void OnStart()
{
  A x,y;
  x.set(10);
  y.set(20);
  Print("x = ",x.get());   // 10
  Print("y = ",y.get());   // 20
  y.set(x,777);
  Print("x = ",x.get());   // 777
  Print("y = ",y.get());   // 20
}
//+------------------------------------------------------------------+
 
ist sein eigenes privates Feld
 
Andrei Trukhanovich:
dies ist ein eigenes privates Feld

OK, danke!

Aber wenn eine abgeleitete Klasse in einer übergeordneten Klasse private Felder auf die gleiche Weise ändert, ist das "legal"?

d.h. in ähnlicher Weise:

class B: private A
{
        A a;
        void setA(A &obj, const int value) { a.set(obj,value); }
}
....
A x;
B y;
y.(x.55)
Grund der Beschwerde: