Fehler, Irrtümer, Fragen - Seite 453

 
Interesting:

Erstellen Sie keine dynamischen Objekte - Sie müssen dann nicht mehr alles verwenden, was mit diesen Objekten zusammenhängt (aber Sie können dann viele Dinge nicht mehr tun).

Sie wollen nicht die Bedeutung des Jetzt verstehen, sondern die Bedeutung der Arbeit mit dynamischen Objekten...

//////////////////////////////////////// FOLGEN SIE MEINEM TEXT (ICH KANN NICHT AUS DEM ZITAT HERAUSKOMMEN) :) //////////////////////////////////////////////////////////////

void OnStart()
{
//---
primer obekt;
obekt.f1();
}
//+------------------------------------------------------------------+
Klassenprimus
{
öffentlich:
void f1();

primer();
};

primer::primer()
{
Alert("Ich glaube, auch hier erfolgt die Initialisierung nur zum Zeitpunkt der Erstellung");
};

primer::f1()
{
int l[];
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]);
};

Dieser Code führt nicht zu einem Fehler und das Array ist dynamisch. Warum????

Und wenn Sie es zerstören wollen:

{

obekt;
obekt.f1();


}

Es scheint, als hätten sie C++ genommen und die Adressverarbeitung verpfuscht und in MQL eingebaut

 

220Volt:

WEITER IST MEIN TEXT (ICH KANN NICHT AUS DEM ZITAT HERAUSKOMMEN) :)

Dieser Code führt nicht zu einem Fehler und das Array ist dynamisch. Warum????

1. warum sollte sie mit einem Fehler ausgeführt werden?

a) Das Objekt wird automatisch erstellt (dies wird durch die Methode der Deklaration einer Objektinstanz in OnStart verursacht) und wird automatisch gelöscht

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

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

obekt.f1();

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

Die Instanzen der Objekte können automatisch oder dynamisch erstellt werden. Im ersten Fall wird der Konstruktor in der Regel während der Initialisierung ausgeführt, im zweiten Fall wird er nach der Verwendung des new-Operators ausgeführt.

b) Logischerweise sollte es auch in f1() keine Fehler geben (obwohl ich persönlich es anders implementiert hätte).

Was die dynamischen Arrays betrifft. Sie unterscheiden sich von statischen Arrays dadurch, dass solche Arrays keine bekannte Dimensionalität haben, was bedeutet, dass Sie, bevor Sie mit einem solchen Array arbeiten, es mit ArrayResize spezifizieren sollten (Sie sollten eine neue Größe in der ersten Array-Dimension angeben). Es ist wichtig zu beachten, dass die Array-Elemente von 0 an nummeriert werden.

2. Wenn Sie an der Arbeit mit dynamischen Objekten interessiert sind, studieren Sie bitte sorgfältig dieses Beispiel - Tetris (obwohl ich immer noch nicht verstehe, was es im alten Forum macht)...

 

Es tut mir leid, dass ich mich einmische, aber ich möchte der Sache wirklich auf den Grund gehen. Ich werde Ihnen sagen, was ich falsch mache.

Betrachten wir die C++-Notation (wir haben eine deklarierte Primer-Klasse)

Primer *ukazatel=neuer Primer;

besagt, dass ukazatel die Adresse im Speicher enthält, an der unser Objekt, eine Kopie der Primer-Klasse, gespeichert ist. Von MQL-Adressen entfernt werden, und ukazatel enthält ein Objekt Deskriptor. Was haben wir davon? Der einzige Unterschied, der mir aufgefallen ist, ist, dass, wenn wir innerhalb des Blocks ein neues Objekt deklarieren und vergessen, delete zu verwenden, bevor wir den Block beenden, das Objekt erst gelöscht wird, wenn das Programm beendet ist. Und nach dem Verlassen des Blocks wird die Verbindung mit diesem Objekt über das Handle verloren gehen.

Ich hatte den Gedanken, dass, wenn durch neue deklariert, dann der Speicher für das Objekt dynamisch zugewiesen wird (dh, es kann seine Größe zu erhöhen), und wenn keine neue, dann das Objekt kann nur statische Variablen haben. Aber meine Annahme wurde nicht bestätigt (das Skript, das ich früher gepostet, das Objekt ist nicht durch neue deklariert, aber es geht mit einer dynamischen Variablen).

Und nach all diesen Leidenschaften bin ich in einer nicht sehr schönen Situation, und ich verstehe nicht, was ist der Unterschied mit neuen oder ohne sie, und wenn der Compiler selbst etwas dort behebt, warum sollte ich mir die Mühe machen?

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

Ich habe sogar versucht, so etwas zu tun, wie es in der Dokumentation beschrieben ist (um etwas über new herauszufinden):

Schalter(5)

{

Fall 5: m_shape=new CTetrisShape1; // diese Option funktioniert überhaupt nicht (und das steht in der Dokumentation!!!!!!) nur auf diese Weise

( m_shape=new CTetrisShape1; )

}

und jetzt können wir nicht auf das Objekt m_shape.___ zugreifen, es wird ein Fehler angezeigt

 

220Volt:

Und nun befinde ich mich nach all diesen Leidenschaften in einer nicht sehr guten Situation, und ich verstehe nicht, was der Unterschied zwischen neu und nicht neu ist, und wenn der Compiler dort etwas korrigiert, warum sollte ich mich überhaupt bemühen?

Objektinstanzen werden dynamisch mit dem new if-Operator erstellt (deshalb wollte ich das Tetris-Beispiel sehen):

1. Die Anzahl der Objektinstanzen ist nicht im Voraus bekannt (es wird jedoch davon ausgegangen, dass es immer mehr als eine geben wird);

2. Wenn man ein Array von Zeigern auf "heterogene" Objekte erstellen will, die den gleichen Vorfahren haben;

3. wenn das Objekt (oder vielmehr ein Zeiger auf dieses Objekt) als Parameter für eine Prozedur oder Funktion verwendet werden soll (Sie sollten es wahrscheinlich an die Bibliothek übergeben);

4. Wenn es beabsichtigt ist, mit einem Objekt (sprich: einem Zeiger auf dieses Objekt) in verschiedenen Teilen des Programms zu arbeiten. Ein und dasselbe Objekt "Order" kann zum Beispiel enthalten sein: ein Array von Orders, die vom Expert Advisor erstellt wurden; ein Array von Orders für ein bestimmtes Symbol; ein Array von Orders, die eine bestimmte Position gebildet haben, usw.

5. Es gibt noch viele weitere Aufgaben, die durch die Anwendung von dynamisch erstellten Gelübden und Verweisen auf sie gelöst werden.

 
220Volt:

Ich habe sogar versucht, so etwas zu tun, wie es in der Dokumentation beschrieben ist (um etwas über new herauszufinden):

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

und jetzt können wir nicht auf das Objekt m_shape.___ zugreifen, es wird ein Fehler ausgelöst

Im Tetris-Beispiel wird dies folgendermaßen umgesetzt (beachten Sie, dass in Ihrem Fall der Break-Operator fehlt)

   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;
     }

Vergessen Sie nicht zu prüfen, ob der Zeiger NULL ist

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

Interessant Danke für Ihre Hilfe
 

Die Entwickler.

Bitte geben Sie in der Dokumentation "explizit" alle Dinge an, die entweder im Tester nicht funktionieren oder mit bestimmten Funktionen arbeiten (damit keine unnötigen Fragen aufkommen).

So sollten Sie beispielsweise die Besonderheiten der Ortszeit und der GMT-Zeit (die mit der Serverzeit gleichgesetzt wird) sowie die Problematik von TimeGMTOffset ausdrücklich erwähnen, um das erwartete Ergebnis zu erzielen.

 

Wer weiß - gibt es einen normalen Weg, eine Unicode-Zeichenreihe in eine Zeichenkette zu übersetzen?

 
TheXpert:

Wer weiß - gibt es einen normalen Weg, eine Unicode-Zeichenreihe in eine Zeichenkette zu übersetzen?

Es scheint mir, dass ich jedes Element des Arrays einzeln übersetzen müsste.
Документация по MQL5: Основы языка / Переменные
Документация по MQL5: Основы языка / Переменные
  • www.mql5.com
Основы языка / Переменные - Документация по MQL5