Fehler, Irrtümer, Fragen - Seite 710

 

Benötigt, um die Größe eines variablen Arrays zu bestimmen, aber der Fehler kommt heraus:

void OnStart()
  {
   int j=1000;
//---
   double arrBalancesTS[][j];
  }

//---

//---

Es funktioniert direkt mit Konstanten (#define) und mit einem numerischen Wert, aber nicht auf diese Weise. Warum?

 
tol64:

Benötigt, um die Größe eines variablen Arrays zu bestimmen, aber der Fehler kommt heraus:

//---

//---

Es funktioniert direkt mit Konstanten (#define) und mit einem numerischen Wert, aber nicht auf diese Weise. Warum?

Bei Konstanten handelt es sich um ein statisches Array, bei einer Variablen um ein dynamisches. Und die Größe eines dynamischen wird durch ArrayResize bestimmt
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 

tol64:

Und warum?

Die zweite und die folgenden Dimensionen haben eine feste Größe. Sie kann nur durch eine Konstante festgelegt werden.
 
tol64:

Mit Konstanten (#define) und mit einem numerischen Wert funktioniert es direkt, aber nicht so. Warum?

Denn bei der Definition mit #define ersetzt der Compiler das vorgefundene Makro vor der Kompilierung einfach durch den richtigen Eintrag. Daher sieht sie

void OnStart()
  {
//---
   double arrBalancesTS[][1000];
  }

die nicht im Widerspruch zur MQL5-Sprache steht.

 
Yedelkin:

GUT. Dann werde ich die Nerven behalten. So heißt es in der Beschreibung der Funktion Print(), dass "Daten vom Typ double mit einer Genauigkeit von 16 Dezimalstellen nach dem Komma gedruckt werden". Es stellt sich nämlich heraus, dass die Funktion Print() etwas gerundete Daten ausgibt:

ND 0 victorg2 (EURUSD,M1) 11:04:42 Print(b)=200.0
MP 0 victorg2 (EURUSD,M1) 11:04:42 Print(DoubleToString(b,16))=199.999999999999999716

Es geht darum, dass eine reelle Zahl mit nicht mehr als 17 signifikanten Ziffern im Speicher abgelegt wird.

Probieren Sie dieses Beispiel aus, um den Unterschied zu spüren:

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   double a,b;

   a=7.0/200.0;
   b=7.0/a;
   Print("Print(b)=",b);
   Print("Print(DoubleToString(b,16))=",DoubleToString(b,16));

   Print("Print(StringFormat(b,%.15G))=",StringFormat("%.15G",b));
   Print("Print(StringFormat(b,%.16G))=",StringFormat("%.16G",b));
   Print("Print(StringFormat(b,%.17G))=",StringFormat("%.17G",b));
   Print("Print(StringFormat(b,%.18G))=",StringFormat("%.18G",b));
   
//19999999999999997
   Print("Print(StringFormat(b,%.15f))=",StringFormat("%.15f",b));
   Print("Print(StringFormat(b,%.16f))=",StringFormat("%.16f",b));
   Print("Print(StringFormat(b,%.17f))=",StringFormat("%.17f",b));
   
  }
//+------------------------------------------------------------------+
Die Beschreibung in der Hilfe wird korrigiert werden.
 
notused:
Bei Konstanten handelt es sich um ein statisches Array, bei einer Variablen um ein dynamisches. Und die Größe eines dynamischen wird mit ArrayResize bestimmt.
TheXpert:
Die zweite und die folgenden Dimensionen haben eine feste Größe. Sie kann nur durch eine Konstante festgelegt werden.
Rosh:

Denn wenn sie mit #define definiert sind, ersetzt der Compiler vor der Kompilierung einfach das angetroffene Makro durch den richtigen Eintrag. Daher sieht sie

die nicht im Widerspruch zur MQL5-Sprache steht.

Ich danke Ihnen. Können Sie mir sagen, was zu tun ist, wenn die Größe eines Arrays in der ersten und zweiten Dimension in Berechnungen definiert ist und keine Konstante sein kann? Mit ArrayResize() können Sie schließlich nur die Größe der ersten Dimension ändern. Und warum kann ich die Größe eines Arrays ändern, indem ich einen variablen Wert anwende, während er anfangs nicht festgelegt werden kann?
 
tol64:
Ich danke Ihnen. Können Sie mir sagen, was man tun kann, wenn die Größe eines Arrays sowohl in der ersten als auch in der zweiten Dimension durch Berechnungen bestimmt wird und keine Konstante sein kann? Mit ArrayResize() können Sie nur die Größe der ersten Dimension ändern. Und warum kann man die Größe eines Arrays mit Hilfe einer Variablen ändern, während sie anfangs nicht festgelegt werden kann?
bitte Klassen verwenden.
 
tol64:
Ich danke Ihnen. Können Sie mir sagen, was man tun kann, wenn die Größe eines Arrays sowohl in der ersten als auch in der zweiten Dimension durch Berechnungen bestimmt wird und keine Konstante sein kann? Mit ArrayResize() können Sie nur die Größe der ersten Dimension ändern. Und warum kann ich die Größe eines Arrays ändern, indem ich einen variablen Wert anwende, während er anfangs nicht festgelegt werden kann?
Werfen Sie einen Blick auf den Abschnitt Überladen von Operationen, um ein Beispiel für die Klasse CMatrix zu sehen, vielleicht wird dies für Sie funktionieren.
 
Hallo.

Ich kann nicht herausfinden, wie man 2 Klassen dazu bringt, Nachrichten auszutauschen.

Ich möchte, dass die Klasse A eine Verbindung zu B und die Klasse B zu A hat.
Ich bekam einen Kompilierungsfehler, vielleicht erlaubt MQL5 das nicht. Aber ohne sie wird die Objektprogrammierung zu 30 % genutzt.

Die Lösung könnte darin bestehen, eine große GOTT-Klasse zu schreiben, die alles weiß und weiß. Aber das scheint mir nicht sehr elegant zu sein.
Wer kann bei der Lösung helfen?

Vielen Dank im Voraus!
Grund der Beschwerde: