Fehler, Irrtümer, Fragen - Seite 216

 
Vigor:

Ich bin auf ein Call-Stack-Overflow-Problem gestoßen (so glaube ich).

Nach dem Aufruf einer Methode eines der Objekte, siehe Beispiel unten. Der Code ist vereinfacht, nur das Wesentliche. Die Klasse CClass1 ist eine Basisklasse und list1 hat verschiedene Objekte, die von dieser Klasse abstammen und deren Init-Funktionen unterschiedlich implementiert sind. In einer Klasse, in der die init-Funktion eine solche Liste abruft (um es einfach auszudrücken, initialisiert sie eine verschachtelte Schnittstelle, ein Panel im Panel), nachdem sie von init in der Zeile

es liegt ein Fehler vor

2010.12.02 00:21:00 test1 (EURUSD,H1) Ungültiger Zeigerzugriff in 'Container.mqh' (74,10)

D.h. der Zeiger t ist tot.

Beim Debuggen tritt kein solcher Fehler auf, nach dem Methodenaufruf ist der Zeiger "lebendig", verschachtelte Schnittstellen werden erstellt und Expert Advisor arbeitet weiter.

Dies ist die einzige Möglichkeit, den Fehler zu umgehen:

#property stacksize pointer hat nichts gebracht.

Es ist schwer, etwas mit Sicherheit zu sagen. Sie benötigen den Quellcode.

Versuchen Sie, eine Anfrage an servicedesk zu schreiben.

Общайтесь с разработчиками через Сервисдеск!
Общайтесь с разработчиками через Сервисдеск!
  • www.mql5.com
Ваше сообщение сразу станет доступно нашим отделам тестирования, технической поддержки и разработчикам торговой платформы.
 

Ich kam aus dem Urlaub zurück, startete Terminals, aktualisierte auf die 360er Version und ein Indikator funktionierte nicht mehr...

Ich habe die Änderungen gelesen: 6. MQL5: Feste Verarbeitung des Klick-Ereignisses in einem Diagramm.

Wenn Sie auf ein grafisches Objekt klicken, werden jetzt zwei Ereignisse gleichzeitig erzeugt: CHARTEVENT_OBJECT_CLICK + CHARTEVENT_CLICK, während es vorher nur ein CHARTEVENT_OBJECT_CLICK gab, was es ermöglicht, einen Doppelklick zu simulieren

Wird das immer so sein oder ist das ein Fehler?

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Типы событий графика
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Типы событий графика
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы графиков / Типы событий графика - Документация по MQL5
 
AlexSTAL:

Ich kam aus dem Urlaub zurück, startete die Terminals, aktualisierte auf den 360er Build und ein Indikator funktionierte nicht mehr...

Änderungen einlesen: 6. MQL5: Korrigierte Verarbeitung des Klick-Ereignisses in einem Diagramm.

Wenn Sie auf ein grafisches Objekt klicken, werden jetzt zwei Ereignisse gleichzeitig erzeugt: CHARTEVENT_OBJECT_CLICK + CHARTEVENT_CLICK, während es vorher nur ein CHARTEVENT_OBJECT_CLICK gab, was es ermöglicht, einen Doppelklick zu simulieren

Wird das immer so sein oder ist das ein Fehler?

Dies wurde absichtlich so gemacht.
 

Wieder einmal stieß ich auf die Mauer der Unmöglichkeit,

Ich muss einen Parameter an den Konstruktor übergeben, so dass die Klasse mit bestimmten Parametern initialisiert wird,

Wie kann ich dieses Problem umgehen? Was empfehlen Sie?

 
Urain:

Wieder einmal stieß ich auf die Mauer der Unmöglichkeit,

Ich muss einen Parameter an den Konstruktor übergeben, damit die Klasse mit bestimmten Parametern initialisiert werden kann,

Wie kann ich dieses Problem umgehen?


к

Nun, ich sehe keinen anderen Ausweg.

class test{
  private:
    bool inited;
    int value;  
  public:
    void test(){
      inited = false;
    }
    
  bool Set( int passed ){
    value = passed;
    return(true);
  }
  bool Init( int passed ){
    if ( Set( passed ) ){
      inited = true;
      return(true);
    }
    return(false);
  }
  int Get( ){
    if( !inited ){
      Print("Объект неинициализирован");
      return(-1);
    }
    return(value);
  }
};

void OnStart()
  {
  
  
  test var;
  if( !var.Init(1)){
    Print("Ошибка инициализации объекта");
    return;
}
  Print(var.Get());
  
  test var2;
  Print( var2.Get() );
  }

und natürlich müssen Sie bei geerbten Klassen die Inits in die richtige Reihenfolge bringen

Ich wünschte, sie würden einen Artikel über die Fehlerbehandlung in komplexen Projekten schreiben,Drucken und zurückgeben, wie hier ist nicht die Lösung.

 
gdtt:

Nun, ich sehe keinen anderen Ausweg.

Und natürlich müssen Sie bei geerbten Klassen die Inits in die richtige Reihenfolge bringen

Generell würde ich mir wünschen, dass sie einen Artikel über Fehlerbehandlung in komplexen Projekten schreiben, Print und Return ist hier nicht die Lösung.

Das heißt, es soll ein Vorkonstruktor erstellt werden, der den Konstruktionsprozess abschließt und der wiederum ein Initialisierungskennzeichen anzeigt.

Im Allgemeinen ist dies eine gute Lösung, aber es gibt einige Unannehmlichkeiten. Wir müssen jede Funktion mit einem Initialisierungsflag abfragen, und bei einer großen Anzahl von Klassenfunktionen ist das nicht praktisch.

Was ist, wenn wir etwas ändern müssen? Dann müssen alle Funktionen neu geschrieben werden.

SZ Ich habe den Code bearbeitet und den Tippfehler korrigiert.

class test
  {
private:
   bool              inited;
   int               value;
public:
                     test(void){inited=false;};
   bool Set(int passed){value=passed;return(true);};
   bool Init(int passed)
     {
      if(Set(passed))inited=true;    
      return(inited);
     };
   int Get()
     {
      if(!inited)
        {
         Print("Объект неинициализирован");
         return(-1);
        }        
      return(value);
     };
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {

   test var;
   var.Init(1);
   Print(var.Get());

   test var2;
   Print(var2.Get());
  }
 
Urain:

D.h. einen Vorkonstruktor erstellen, der den Konstruktionsprozess abschließt und der wiederum ein Initialisierungsflag setzt.

Im Allgemeinen ist es in Ordnung, aber es gibt einige Unannehmlichkeiten. Wir müssen jede Funktion nach dem Initialisierungskennzeichen abfragen, und bei einer großen Anzahl von Klassenfunktionen ist das nicht sehr praktisch.

Der Code für das erste Mal wurde auf dieselbe Weise aktualisiert wie für das zweite Mal.

SZ Ich habe den Code bearbeitet und das Versehen behoben.

Nun, wenn es einen Konstruktor gäbe, würde das nicht bedeuten, dass die Initialisierung erfolgreich war. In jedem Fall müssen Sie die Tatsache der Initialisierung überprüfen

Natürlich können Sie es einmal überprüfen:

void OnStart()
  {

   test var;
   if( ! var.Init(1)){
     // здесь какято обрабтка
     return;
   };
   Print(var.Get());

   test var2;
   Print(var2.Get());
  }

Aber wenn Sie Ihren eigenen Code verwenden, können Sie es zu einer Regel machen, die Tatsache der Initialisierung zum Zeitpunkt des Aufrufs zu überprüfen, und wenn er von anderen verwendet wird, können Sie nicht in Anweisungen schreiben: "Sie müssen nur diese Konstruktion verwenden, sonst kann ich nicht für die Folgen garantieren". Nein, Sie müssen ohnehin die Initialisierung in Klassenmethoden überprüfen.

 

An die Entwickler.

Unmittelbar nach dem Neustart des neuen Builds


PS

Das Update des Terminals, das in einem anderen Ordner installiert wurde, war erfolgreich, die Symbole sind in der Liste (aber es gab keine offenen Charts vor dem Update)...

 

Sagen Sie mir, ob es sich um einen Fehler handelt oder ob es nicht erlaubt ist.

ENUM_ORDER_TYPE Signal[21];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   ArrayInitialize(Signal,WRONG_VALUE);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+

Es gibt einen Fehler

'ArrayInitialize' - no one of the overloads can be applied to the function call 
 
sergey1294:

Bitte sagen Sie mir, ob dies ein Fehler ist oder nicht erlaubt ist.

Sie werden eine Fehlermeldung erhalten


Wahrscheinlich geht es darum, dass ArrayInitialize() nur Arrays eines bestimmten Typs füllen soll, und zwar numerisch (höchstwahrscheinlich int oder double).

Da das Array vom Typ ENUM_ORDER_TYPE ist, wird der Aufruf von ArrayInitialize einen Fehler verursachen, der besagt, dass diese Methode des Aufrufs nicht erlaubt ist.

Meiner Meinung nach gibt es in diesem Fall zwei Möglichkeiten:

1. den Array-Typ ENUM_ORDER_TYPE in int umzuwandeln und gleichzeitig im Code zu berücksichtigen (zumindest Order-Typen können leicht als int dargestellt werden);

2. Unabhängige Implementierung der "Initialisierung" des Arrays.

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