Alle Werte aus Array löschen

 

Hat jemand eine Ahnung, warum mein Array nicht gelöscht wird (double Werte aus Array entfernen) 

double   pendingSet[];
short    pendingSetIdx=-1;

int OnInit(){
pendingSetIdx = -1;
ArrayResize(pendingSet,100000);
}

void OnTick() {
ArrayRemove(pendingSet,-1,pendingSetIdx=WHOLE_ARRAY);
}

Also rein von der Abfrage "ArrayRemove".. passt das? 


 
  1. Warum weist Du nicht das Ergebnis des Funktionsaufruf einer Variablen zu, um sie und _LastError zu überprüfen? :(
  2. Der Typ der beiden Parameter start und count ist uint - Du hast bestimmt eine Warnung des Compilers erhalten und ignoriert :(
  3. Wenn bei der Funktionsdeklaration für einen Parameter angegeben wird "count=WHOLE_ARRAY" heißt das, dass ein Default-Wert angegeben ist, sodass die Funktion aus ohne ihn aufgerufen werden kann. :(
  4. Hast Du die Dok. zu der Funktion mal angesehen? Dort gäbe es ein Beispiel: https://www.mql5.com/de/docs/array/arrayremove. :(
  5. Ich weiß  ja nicht genau, was Du willst, aber schau mal nach den Funktionen: ZeroMemory(), ArrayFree(), ArrayFill(), ArrayInitialize() und ArrayResize() - und überall gibt es Beispiele.
Dokumentation zu MQL5: Operationen mit Arrays / ArrayRemove
Dokumentation zu MQL5: Operationen mit Arrays / ArrayRemove
  • www.mql5.com
ArrayRemove - Operationen mit Arrays - Nachschlagewerk MQL5 - Nachschlagewerk über die Sprache des algothitmischen/automatischen Handels für MetaTrader 5
 
Carl Schreiber #:
  1. Warum weist Du nicht das Ergebnis des Funktionsaufruf einer Variablen zu, um sie und _LastError zu überprüfen? :(
  2. Der Typ der beiden Parameter start und count ist uint - Du hast bestimmt eine Warnung des Compilers erhalten und ignoriert :(
  3. Wenn bei der Funktionsdeklaration für einen Parameter angegeben wird "count=WHOLE_ARRAY" heißt das, dass ein Default-Wert angegeben ist, sodass die Funktion aus ohne ihn aufgerufen werden kann. :(
  4. Hast Du die Dok. zu der Funktion mal angesehen? Dort gäbe es ein Beispiel: https://www.mql5.com/de/docs/array/arrayremove. :(
  5. Ich weiß  ja nicht genau, was Du willst, aber schau mal nach den Funktionen: ZeroMemory(), ArrayFree(), ArrayFill(), ArrayInitialize() und ArrayResize() - überall gibt es Beispiele.

Ich hatte im Compiler tatsächlich keine Warnung erhalten! Deshalb habe ich mich auch halb tot gesucht.

Ok, also ich bin dem jetzt mal nachgegangen, lerne ja immer dazu..

meine Fehlernummer über GetLastError() ist (noch nie benutzt) :

  • 5052 – ERR_SMALL_ARRAY (Zu großer Wert für start)

    hatte wie du sagtest auch mal uint ausprobiert, da bekomme ich aber einen Critical Error im Journal und der Tester hängt sich auf.


5. Also ich will einfach nur alle Werte raus löschen (die Preise, die man oben im Bild-Ausschnitt sieht), mehr nicht. Schaue mir mal die anderen Funktionen an.. dachte ArrayRemove wäre vom Grundsatz her richtig. 

 

Verwende (fast) ganz oben (nach version):

#property strict

Naja - nicht denken, nachlesen ist besser und sich an Beispielen orientieren noch besser.

 
Carl Schreiber #:
Naja - nicht denken, nachlesen ist besser und sich an Beispielen orientieren noch besser.

Ja klar, hast du vollkommen Recht. Bin aber eben erst daraus schlau geworden :D. Selbst ausprobieren ist meiner Meinung nach auch immer viel Wert.. 

Er tut jetzt, was er soll, habe glaube einfach zu kompliziert gedacht. For-Loop, alle Werte auf 0.0 und fertig. Der Rest war aber sehr informativ und in Zukunft braucht man das bestimmt mal.. 

Danke Dir.. mal wieder. 

 
Yango:

Hat jemand eine Ahnung, warum mein Array nicht gelöscht wird (double Werte aus Array entfernen) 

Also rein von der Abfrage "ArrayRemove".. passt das? 


Entfernt die angegebene Anzahl von Elementen im Array, beginnend mit dem angegebenen Index.

Entfernt die angegebene Anzahl von Elementen im Array, beginnend mit dem angegebenen Index.



bool  ArrayRemove( 
   void&        array[],            // Array irgendeines Typs 
   uint         start,              // Startindex für das Entfernen 
   uint         count=WHOLE_ARRAY   // Anzahl der Elemente 
   );
 

also muss das so sein um alle wete zu löschen :

 ArrayRemove(pendingSet,0,WHOLE_ARRAY);


was aber nur für das gesammte Array zutrifft wenn nen bestimmten eintrag löschen willst geht das so:

ArrayRemove(pendingSet,0,x);
wobei x die nummer im Array ist also der Speicherplatz das Beispiel löscht alles ab 0 bis wert x, du kannst also genauer selektieren:
ArrayRemove(pendingSet,5,7);
Hier wird Arrayplatz[5] bis Arrayplatz[7]  gelöscht.


Zieh dir mal das Beispiel aus der Referenz Rein(siehe Quelle):

//+------------------------------------------------------------------+ 
//| Skript Programm Start Funktion                                   | 
//+------------------------------------------------------------------+ 
void OnStart() 
  { 
//--- Deklarieren des Arrays mit fixer Größe und der Wertezuweisung 
   int array[10]; 
   for(int i=0;i<10;i++) 
     { 
      array[i]=i; 
     } 
//--- Anzeigen des Arrays vor dem Entfernen der Elemente 
   Print("Vor dem Aufruf von ArrayRemove()"); 
   ArrayPrint(array); 
//--- Entfernen von 2 Elementen im Array und dessen Darstellung danach 
   ArrayRemove(array,4,2); 
   Print("Nach dem Aufruf von ArrayRemove()"); 
   ArrayPrint(array); 
/* 
  Ausführungsergebnis: 
  Vor dem Aufruf von ArrayRemove() 
   0 1 2 3 4 5 6 7 8 9 
  Nach dem Aufruf von ArrayRemove() 
   0 1 2 3 6 7 8 9 8 9 
*/

Quelle:

https://www.mql5.com/de/docs/array/arrayremove

Dokumentation zu MQL5: Operationen mit Arrays / ArrayRemove
Dokumentation zu MQL5: Operationen mit Arrays / ArrayRemove
  • www.mql5.com
ArrayRemove - Operationen mit Arrays - Nachschlagewerk MQL5 - Nachschlagewerk über die Sprache des algothitmischen/automatischen Handels für MetaTrader 5
 
Aleksi-Trader #:

Entfernt die angegebene Anzahl von Elementen im Array, beginnend mit dem angegebenen Index.


was aber nur für das gesammte Array zutrifft wenn nen bestimmten eintrag löschen willst geht das so:

wobei x die nummer im Array ist also der Speicherplatz das Beispiel löscht alles ab 0 bis wert x, du kannst also genauer selektieren: Hier wird Arrayplatz[5] bis Arrayplatz[7]  gelöscht.


Zieh dir mal das Beispiel aus der Referenz Rein(siehe Quelle):

Quelle:

https://www.mql5.com/de/docs/array/arrayremove

Vielen Dank, dass du Dir so viel Zeit genommen hast! 


Hierbei wird das Array leider nicht bereinigt, hatte ich schon versucht: 

ArrayRemove(pendingSet,0,WHOLE_ARRAY);

Fehlt vielleicht eine Schleife? 

Wenn ich die 0 zur -1 mache (wegen:

pendingSetIdx = -1;

) , bekomme ich einen critical Error im Journal. Den Rest hatte ich gecheckt und das leuchtet auf jeden Fall ein! 

 
Yango #:

Vielen Dank, dass du Dir so viel Zeit genommen hast! 


Hierbei wird das Array leider nicht bereinigt, hatte ich schon versucht: 

Fehlt vielleicht eine Schleife? 

Wenn ich die 0 zur -1 mache (wegen:

) , bekomme ich einen critical Error im Journal. Den Rest hatte ich gecheckt und das leuchtet auf jeden Fall ein! 

-1 wäre wie array[-1] die kleinste zahl ist aber 0... deswegen der Critical Error...


Klatsch mal das aufs Chart..... bei mir funtz das...

void OnStart()
  {
//--- Deklarieren des Arrays mit fixer Größe und der Wertezuweisung
   int array[];
   for(int i=0; i<10; i++)
     {
      ArrayResize(array,i+1);
      array[i]=i;
     }
     
//--- Anzeigen des Arrays vor dem Entfernen der Elemente
   Print("Vor dem Aufruf von ArrayRemove()");
   ArrayPrint(array);
//--- Entfernen von allen Elementen im Array und dessen Darstellung danach
   ArrayRemove(array,0,WHOLE_ARRAY);
   Print("Nach dem Aufruf von ArrayRemove()");
   ArrayPrint(array);
  }
 
Aleksi-Trader #:

-1 wäre wie array[-1] die kleinste zahl ist aber 0... deswegen der Critical Error...


Klatsch mal das aufs Chart..... bei mir funtz das...

      for(int b=0; b<10; b++)
     {
      ArrayResize(pendingSet,b+1);
      pendingSet[b]=b;
     }
     
//--- Anzeigen des Arrays vor dem Entfernen der Elemente
   Print("Vor dem Aufruf von ArrayRemove()");
   ArrayPrint(pendingSet);
//--- Entfernen von allen Elementen im Array und dessen Darstellung danach
   ArrayRemove(pendingSet,0,WHOLE_ARRAY);
   Print("Nach dem Aufruf von ArrayRemove()");
   ArrayPrint(pendingSet);
           }
     }
} 

 
Yango #:

Du machst nicht, was dir die Experten raten.


Dein Code enthält OnTick() also nicht der Code der vom Alekski-Trader ist.

Dann kommt das hier


Aus diesem Code der funktioniert musst du deine Version anpassen.

Lerne lesen was im Code passiert. Erst wenn du verstehst was da passiert kannst den den Fehler  in deinem Code erkennen.

 
Christian #:

Du machst nicht, was dir die Experten raten.


Dein Code enthält OnTick() also nicht der Code der vom Alekski-Trader ist.

Dann kommt das hier


Aus diesem Code der funktioniert musst du deine Version anpassen.

Lerne lesen was im Code passiert. Erst wenn du verstehst was da passiert kannst den den Fehler  in deinem Code erkennen.

Bei Aleksi-Trader ist es die 

void OnStart()

, habe ich schon erkannt. Aber ich verstehe trotzdem nicht, was ich falsch mache und es anpassen kann/soll. 

Grund der Beschwerde: