Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   Fehlermeldung: 8 leaked strings left (http://www.expert-advisor.com/forum/showthread.php?t=6652)

AVT 08.05.20 22:39

Fehlermeldung: 8 leaked strings left
 
Diese Fehlermeldung bekomme ich unter "Experten".
Situation:
2 Tabellen, eine mit einer PairListe und eine mit einer AnalyseListe.
Beide Tabellen sind eigenständige Indikatoren.

1. Ich lade jede Indikator-Tabelle separat in einem eigenen Chart-Fenster.
Ich kann in jeder Tabelle nun durch Klick auf den Symbolnamen einen neuen Chart für das Symbol (samt der vorher definierten Vorlage) laden.

2. Ich lade beide Indikator-Tabellen zusammen in einem Chart-Fenster, erst die AnalyseListe und danach die PairListe.
A. Wenn ich aus der AnalyseListe durch Klick einen neuen Symbolchart aufmachen will, ist alles ok.
B. Wenn ich aber aus der PairListe durch Klick einen neuen Chart aufmachen will, bekomme ich die Fehlermeldung über "leaked strings left". Es wird zwar der Symbolchart aufgemacht, aber ohne Vorlage und das Fenster mit den beiden Tabellen verschwindet mit besagtem Abschiedsgruß :eek:

Frage:
Was bedeutet diese Meldung? Ich habe zwar schon etliche Google Resultate durchgelesen, trotzdem verstehe ich nur Bahnhof - da helfen weder eine Übersetzung noch irgendwelche Lösungsvorschläge (klaro, daß man von Lösungen nix versteht, wenn man nicht weiß, was das Problem ist - wie können denn irgendwelche Strings übrigbleiben, und was zum Teufel sind undichte Strings :confused:).

Wäre nett, wenn jemand mich aufklären könnte, damit ich versuchen kann eine Lösung zu finden. Danke. AVT

RetepM 09.05.20 08:39

Man findet wenig zu dem Thema. In einem Thread wird der Programmierer gebeten, den Code an den Support zu schicken.
Anscheinend durchläuft der EA vor der Fehlermeldung eine Zählschleife ??daher die Zahl vor dem Error?? guck doch mal ob Du im Code einen leeren String behandelst, durch 0 teilst oder ob, wenn im Code, bei StringTrimLeft etwas schief geht.
Grüße

MA-EA 09.05.20 08:43

Lad doch mal die Quellcodes hoch. ;)

AVT 09.05.20 13:35

Danke für Deine Tips, ich bin sie durchgegangen.
Zitat:

Zitat von RetepM (Beitrag 43627)
Man findet wenig zu dem Thema. In einem Thread wird der Programmierer gebeten, den Code an den Support zu schicken.

Den hab ich auch gelesen ;)
Zitat:

Zitat von RetepM (Beitrag 43627)
Anscheinend durchläuft der EA vor der Fehlermeldung eine Zählschleife ??daher die Zahl vor dem Error??

Das ist kein EA, das sind 2 Indikatoren (2 EAs gehen nicht zusammen auf einen Chart) - nur nebenbei, tut aber glaube ich nix zur Sache.
Zitat:

Zitat von RetepM (Beitrag 43627)
guck doch mal ob Du im Code einen leeren String behandelst, durch 0 teilst oder ob, wenn im Code, bei StringTrimLeft etwas schief geht.

1."StringTrimLeft": neg., gibt's im ganzen Code nicht
2. 0 Teilung: (neg.), nicht im Code für "neuen Chart"-Knopf
-. außerdem würde das nicht "zero division" Error ergeben?
3. leerer String: (neg.), dann würde er keinen neuen Chart öffnen

Beispiel:
Code:

// in OnChartEvent:
  if(  id==CHARTEVENT_OBJECT_CLICK                //ObjectWasClicked
      && StringFind(sparam,PFX+"pName")>= 0 )      //sparam=FullButtonName
  {
        OpenChart( FindPairNameOfButton(sparam) );
            ObjectSetInteger(0,sparam,OBJPROP_STATE,false);
        return;       
  }//ButtonNameWasClicked

// in OnInit: Loop für alle Knöpfe
  CreatePairButton("pName"+IntegerToString(i),xOffset,pOffset+i*LineHeight,Apairnames[i]);  //Name

// Funktion, die in OnChartEvent verwendet wird:
string FindPairNameOfButton(string ButtonName="FullButtonName")
{
  string Result="";
  int Startposition=StringLen(PFX+"pName");
  string PairNumber=StringSubstr(ButtonName,Startposition); //From"PFX_pName"ToEnd
  int    PairInteger=(int)StringToInteger(PairNumber);
  Result=SSpairTable[PairInteger].SpairName;
  return(Result);
}

// Zuweisung von Nummer zu Name über:
struct SSpair //StructSortedPair:
{
  int    SpairNo;      //PairIDnumber
  string SpairName;    //PairName
}; SSpair SSpairTable[];

Ich sehe nicht, wo hier irgendwas falsch sein soll, zudem funktioniert diese Tabelle ja einwandfrei, wenn sie alleine auf einem Chart liegt.
AVT

AVT 09.05.20 13:44

Zitat:

Zitat von MA-EA (Beitrag 43628)
Lad doch mal die Quellcodes hoch. ;)

:D Willst Du 3000 Zeilen Code analysieren, wo möglich noch parallel ?? :D

AVT 10.05.20 18:33

Es war in den Google Ergebnisse ja die Rede von Arrays.
Zuerst habe ich sichergestellt, daß alle Arrays eindeutige Namen haben.
Das half nicht.

Dann habe ich mir die ErrorCodes vorgenommen.
Da tauchte eine 7 = ERR_NOT_ENOUGH_RIGHTS auf, und zwar für den Chart, der geöffnet werden soll. Es liegt also irgendwo in dem Aufruf der Charts ein Fehler. Den suche ich jetzt. :rolleyes: AVT auf der Suche

traderdoc 10.05.20 18:49

Zitat:

Zitat von MA-EA (Beitrag 43628)
Lad doch mal die Quellcodes hoch. ;)

@MA-EA, was willst DU denn mit dem Code?

traderdoc

AVT 10.05.20 20:20

die Buttons werden nicht erkannt
 
Logfile dazu (unwichtiges rausgenommen):
Code:

================ 1. Tabelle FX-PairStrength2, 4 verschiedene Button-Klicks: immer ok
FX-PairStrength2 EURUSD,H4: OnChartEvent PairStrength2 button FXpsL_11_AUDJPY button was clicked.
FX-PairStrength2 EURUSD,H4: OnChartEvent calling FindpsButtonPair(FXpsL_11_AUDJPY)
FX-PairStrength2 EURUSD,H4: FindpsButtonPair Startposition: 9
FX-PairStrength2 EURUSD,H4: FindpsButtonPair PairName: AUDJPY
FX-PairStrength2 EURUSD,H4: FindpsButtonPair Result: AUDJPY

FX-PairStrength2 EURUSD,H4: OnChartEvent PairStrength2 button FXpsL_14_EURGBP button was clicked.
FX-PairStrength2 EURUSD,H4: OnChartEvent calling FindpsButtonPair(FXpsL_14_EURGBP)
FX-PairStrength2 EURUSD,H4: FindpsButtonPair Startposition: 9
FX-PairStrength2 EURUSD,H4: FindpsButtonPair PairName: EURGBP
FX-PairStrength2 EURUSD,H4: FindpsButtonPair Result: EURGBP

FX-PairStrength2 EURUSD,H4: OnChartEvent PairStrength2 button FXpsL_22_NZDJPY button was clicked.
FX-PairStrength2 EURUSD,H4: OnChartEvent calling FindpsButtonPair(FXpsL_22_NZDJPY)
FX-PairStrength2 EURUSD,H4: FindpsButtonPair Startposition: 9
FX-PairStrength2 EURUSD,H4: FindpsButtonPair PairName: NZDJPY
FX-PairStrength2 EURUSD,H4: FindpsButtonPair Result: NZDJPY

FX-PairStrength2 EURUSD,H4: OnChartEvent PairStrength2 button FXpsL_24_USDCAD button was clicked.
FX-PairStrength2 EURUSD,H4: OnChartEvent calling FindpsButtonPair(FXpsL_24_USDCAD)
FX-PairStrength2 EURUSD,H4: FindpsButtonPair Startposition: 9
FX-PairStrength2 EURUSD,H4: FindpsButtonPair PairName: USDCAD
FX-PairStrength2 EURUSD,H4: FindpsButtonPair Result: USDCAD

================ 2. Tabelle FX-PairLists2: das Chaos beginnt
===> NEIN, das war FX-PairLists2 !! also ist auch die Namensfindung falsch
FX-PairStrength2 EURUSD,H4: OnChartEvent PairStrength2 button FXplist_pName4 button was clicked.
FX-PairStrength2 EURUSD,H4: OnChartEvent calling FindpsButtonPair(FXplist_pName4)
FX-PairStrength2 EURUSD,H4: FindpsButtonPair Startposition: 9
FX-PairStrength2 EURUSD,H4: FindpsButtonPair PairName: Name4
FX-PairStrength2 EURUSD,H4: FindpsButtonPair Result: Name4

===> jetzt hat er es kapiert, die Namensauflösung ist korrekt,
===> dieser Chart kann aufgemacht werden
FX-PairLists2 EURUSD,H4: FXplist_pName4 PairList2 button was clicked.
FX-PairLists2 EURUSD,H4: OnChartEvent substring FXplist_pName found in FXplist_pName4
FX-PairLists2 EURUSD,H4: OnChartEvent calling FindplButtonPair(FXplist_pName4)
FX-PairLists2 EURUSD,H4: FindplButtonPair Startposition: 13
FX-PairLists2 EURUSD,H4: FindplButtonPair PairNumber: 4
FX-PairLists2 EURUSD,H4: FindplButtonPair PairNumber in Table: 4
FX-PairLists2 EURUSD,H4: FindplButtonPair PairName in Table: AUDUSD

===> das ist der Fehler, der zuerst gemacht wurde, der verursacht das:
FX-PairStrength2 EURUSD,H4: uninit reason 7
FX-PairStrength2 EURUSD,H4: OnDeinit last error: internal error
FX-PairStrength2 EURUSD,H4: OnDeinit reason: 7

===> der geht dann natürlich mit
FX-PairLists2 EURUSD,H4: uninit reason 7
FX-PairLists2 EURUSD,H4: OnDeinit last error: chart not found
FX-PairLists2 EURUSD,H4: OnDeinit reason: 7

===> die dürften dann aber nicht aus FX-PairLists2 sein, sondern aus FX-PairStrength2
FX-PairLists2 EURUSD,H4: 11 leaked strings left

================ und Tschüß
Custom indicator FX-PairStrength2 EURUSD,H4: removed
Custom indicator FX-PairLists2 EURUSD,H4: removed
===> und was soll der Unsinn, dann auf dem Chart einen Indi zu laden
===> das steht nirgendwo im Code, das das passieren soll
Custom indicator FX-Pairs\MA-EMAtrend EURUSD,H4: loaded successfully
MA-EMAtrend EURUSD,H4: initialized

So, und nun bin ich endgültig mit meinem Latein am Ende. Mehr als überall eindeutige Namen vergeben kann ich nicht. Wenn der MT damit nicht klarkommt, dann weiß ich auch nicht weiter. :mad::mad:
AVT

TraumExperte 11.05.20 08:19

Hmmm,

liegt vermutlich an den Buttons (Objecten). Werden die sauber gelöscht (DeInit) --> (ObjectDelete)? Mal prüfen.

Gruß

TraumExperte

AVT 11.05.20 09:01

Zitat:

Zitat von TraumExperte (Beitrag 43644)
Hmmm,
liegt vermutlich an den Buttons (Objecten). Werden die sauber gelöscht (DeInit) --> (ObjectDelete)? Mal prüfen.

Danke für den Hinweis, hab ich erledigt: Resultat negativ.
Sämtliche Sachen fangen bei mir an mit dem Festlegen eines PFX für Objekte:
Code:

string PFX      = "FXplist_"; //1. Indi: PairList
string PFX      = "FXpsL_"; //2. Indi: pair strength List

DeInit ist bei den meisten (wo es nicht unbedingt notwendig, daß Objekte behalten werden) auch immer dasselbe (die erste Zeile habe ich eingefügt, damit ich nicht immer die Codenummern nachsehen muß):
Code:

void OnDeinit(const int reason)
{
  Print(__FUNCTION__," last error: ",ErrorDescription(GetLastError()) );
  for(int i=0; i<ObjectsTotal(); i++)
  {
      string obj_name=ObjectName(i);
      if(StringSubstr(obj_name,0,StringLen(PFX))==PFX) // object with PFX found
      {
        if(ObjectsDeleteAll(0,PFX,-1,-1)>0) { break; }// delete until done
      }
  }
  Print(__FUNCTION__," reason: ",IntegerToString(reason));
}

Und ich habe einen komplett leeren Chart genommen, beide geladen und auf einen PairList Button gedrückt - exit wie gewohnt - der Chart wird kriegt plötzlich einen anderen Indikator und in der Objektliste ist außer dem ChartId Label Objekt nix mehr.
Der Klartext Fehler sagt, PairList "Chart not found" als LastError. In PairList wird aber der Name richtig aufgelöst (sagt ja auch das Logfile) - nur daß er zuerst die PairStrength Namensauflösung startet, was völlig falsch ist, weil ich auf einen PairList Button drücke.
AVT


Alle Zeitangaben in WEZ +2. Es ist jetzt 09:28 Uhr.

Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum