Einteilung der offenen Stellen in Gruppen - Seite 4

 
Alexey Viktorov:

Kopieren des Arrays "in sich selbst", beginnend an der Position neben dem zu löschenden Array und schreibend ab dem zu löschenden Array. Und dann die Größe anpassen, wie Grigori.S.B vorgeschlagen hat

Interessanterweise, wenn ich Sie richtig verstanden habe, müssen Sie diese Funktion verwenden?

int  ArrayCopy( 
   void&        dst_array[],         // куда копируем 
   const void&  src_array[],         // откуда копируем 
   int          dst_start=0,         // с какого индекса пишем в приемник 
   int          src_start=0,         // с какого индекса копируем из источника 
   int          count=WHOLE_ARRAY    // сколько элементов 
   );
 
Sergey Voytsekhovsky:

Guten Morgen, ich danke Ihnen für Ihre Antwort.

Ich schätze, Sie haben es nicht bemerkt, Sie können oben nachsehen, alle Fragen bezogen sich auf MQL5.

Ich verstehe, dass der Unterschied manchmal nicht entscheidend ist, aber trotzdem. Die von Ihnen zitierte Funktion ändert die Größe des Arrays und schneidet möglicherweise zusätzliche Elemente ab, wenn die Größe verringert wird.

Das ist nicht notwendig. Sie müssen ein Element entfernen, indem Sie es nach seinem Wert suchen. Ich habe diese Funktion auch ausprobiert, ich habe darüber in #23 geschrieben. Trotzdem vielen Dank.

Ich habe auch nicht darauf geachtet. mql5 hat die Funktion ArrayRemove und keine Probleme.

 

In diesem Fall istArrayRemove besser geeignet, es gibt ein Beispiel in der Anleitung, es funktioniert genau wie folgt

//| Script program start function                                    | 
//+------------------------------------------------------------------+ 
void OnStart() 
  { 
//--- объявим массив фиксированного размера и заполним значениями 
   int array[10]; 
   for(int i=0;i<10;i++) 
     { 
      array[i]=i; 
     } 
//--- покажем массив до удаления элементов 
   Print("До вызова ArrayRemove()"); 
   ArrayPrint(array); 
//--- удалим 2 элемента из массива и покажем новый состав 
   ArrayRemove(array,4,2); 
   Print("После вызова ArrayRemove()"); 
   ArrayPrint(array); 
/* 
   Результат выполнения:  
   До вызова ArrayRemove() 
   0 1 2 3 4 5 6 7 8 9 
   После вызова ArrayRemove() 
   0 1 2 3 6 7 8 9 8 9 
*/

Das Problem ist nur, dass diese Beispiele und Funktionen für eindimensionale Arrays konzipiert sind und nicht mit zweidimensionalen Arrays arbeiten wollen.

Ich glaube, ich übersehe etwas sehr Wichtiges und Grundlegendes. Aber was ist das?

Ich sage Ihnen, ich habe das Nachschlagewerk bereits verloren.

 
Sergey Voytsekhovsky:

In diesem Fall istArrayRemove besser geeignet, es gibt ein Beispiel in der Anleitung, es funktioniert genau wie folgt

Das Problem ist nur, dass diese Beispiele und Funktionen für eindimensionale Arrays konzipiert sind und nicht mit zweidimensionalen Arrays arbeiten wollen.

Ich glaube, ich übersehe etwas sehr Wichtiges und Grundlegendes. Aber was ist das?

Ich sage Ihnen, ich habe schon den Überblick verloren.

Ist die Reihenfolge wichtig?
Ändern Sie die Größe des Feldes von der letzten Position, die Sie kopieren, bis zu der Position, die gelöscht werden soll.
 
Alexey Viktorov:
Bei einem zweidimensionalen Array müssen Sie die Zeilennummer für die Löschung mit 2 multiplizieren. Für ein 3-dimensionales Feld multiplizieren Sie mit 3...

Ich verstehe das nicht ganz, könnten Sie das bitte näher erläutern, oder besser noch, zeigen Sie mir die Bearbeitung eines Teils meines Codes, ich habe ihn oben gepostet. Wenn es unbequem ist, werde ich das schon irgendwie hinbekommen.

 
Aliaksandr Hryshyn:
Ist die Reihenfolge wichtig?
Sie kopieren von der letzten Position zu der zu löschenden Position und ändern die Größe des Arrays.

Nein, die Reihenfolge ist nicht wichtig, Sie müssen nur einen bekannten (durch Wissen gefundenen, Index ist bekannt) Eintrag löschen. Es kann überall im Array sein (am Anfang, in der Mitte, am Ende).ArrayRemove ist großartig, alles wäre in Ordnung, aber wie wendet man diese Funktion auf ein zweidimensionales Array an? das Handbuch schweigt dazu.

 
Sergey Voytsekhovsky:

Nein, die Reihenfolge ist nicht wichtig, wir müssen nur einen bekannten (durch Erkennung gefundenen, Index ist bekannt) Datensatz löschen. Es kann überall im Array sein (am Anfang, in der Mitte, am Ende).ArrayRemove ist großartig, alles wäre in Ordnung, aber wie wendet man diese Funktion auf ein zweidimensionales Array an? Es gibt nichts im Handbuch darüber.

Es wird also, wie gesagt, nur das Array in der zweiten Dimension kopiert.
Wenn Sie die Größe eines Arrays ändern, geben Sie auch einen dritten Parameter an, z. B. 32.
 
Sergey Voytsekhovsky:

In diesem Fall istArrayRemove besser geeignet, es gibt ein Beispiel in der Anleitung, es funktioniert genau auf die gleiche Weise

Das einzige Problem ist, dass diese Beispiele und Funktionen für eindimensionale Arrays konzipiert sind und nicht mit zweidimensionalen Arrays arbeiten wollen.

Ich glaube, ich übersehe etwas sehr Wichtiges und Grundlegendes. Aber was ist das?

Ich sage Ihnen, ich habe das Nachschlagewerk verloren.

Das ist Blödsinn. Ich habe diese Funktion genutzt, ohne das Handbuch zu lesen. Im Debugger sah ich, wie das Element gelöscht wurde und die Array-Größe sofort reduziert wurde. Ich habe es überprüft, es funktioniert sogar mit einem Array von Strukturen ohne Probleme. Jetzt kann ich nicht mit dem Code arbeiten, sondern nur mit Worten: Ich möchte zum Beispiel den 3. Es stellt sich heraus, dass der fünfte und sechste Wert entfernt werden müssen. Beim Kopieren ordnet die Funktion jedoch alle Werte in einem eindimensionalen Array an, und es stellt sich heraus, dass das dritte Paar mit Index 5 beginnt. Dies wird in der Regel nach einigen Versuchen deutlich.

Wie für ArrayRemove, wenn ich kann, werde ich es auf 2-4 dimensionalen Arrays testen. Mangels Bedarf habe ich es nie getestet und hatte nicht den Verdacht, dass es nicht funktioniert.


Hinzugefügt:

Geprüft. Vergessen Sie nicht, dass Sie die Größe eines statischen Arrays nicht ändern können. Aus diesem Grund bleibt im Beispiel aus der Dokumentation die Größe des Arrays gleich und die letzten beiden Strings werden wiederholt. Wenn Sie Zeilen aus einem dynamischen Array löschen, ändert sich die Größe ohne Probleme.

Das Handbuch sollte bis zu den Löchern:)))) im Monitor geschrubbt werden.

/********************Script program start function*******************/
void OnStart()
 {
  double arrTest[][ 2];
  for(int i = 0; i < 10; i++)
   {
    ArrayResize(arrTest, i+1);
    arrTest[i][0] = iOpen(_Symbol, PERIOD_CURRENT, i);
    arrTest[i][1] = iClose(_Symbol, PERIOD_CURRENT, i);
   }
    Print("ArraySize ", ArraySize(arrTest));
    ArrayPrint(arrTest);
    ArrayRemove(arrTest, 3, 2);
    Print("ArraySize ", ArraySize(arrTest));
    ArrayPrint(arrTest);
         );
 }/******************************************************************/
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  ArraySize 20
2020.03.23 11:36:02.296 00 (GBPUSD,H1)          [,0]    [,1]
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [0,] 1.16465 1.16084
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [1,] 1.17094 1.16461
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [2,] 1.16878 1.17084
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [3,] 1.16525 1.16876
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [4,] 1.16467 1.16525
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [5,] 1.16491 1.16467
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [6,] 1.16186 1.16498
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [7,] 1.15985 1.16185
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [8,] 1.16156 1.15985
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [9,] 1.15447 1.16156
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  ArraySize 16
2020.03.23 11:36:02.296 00 (GBPUSD,H1)          [,0]    [,1]
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [0,] 1.16465 1.16084
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [1,] 1.17094 1.16461
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [2,] 1.16878 1.17084
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [3,] 1.16491 1.16467
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [4,] 1.16186 1.16498
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [5,] 1.15985 1.16185
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [6,] 1.16156 1.15985
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [7,] 1.15447 1.16156

Hier ist das 3-dimensionale Array und das Ergebnis:

2020.03.23 11:40:11.328 00 (GBPUSD,H1)  ArraySize 30
2020.03.23 11:40:11.328 00 (GBPUSD,H1)          [,0]    [,1]    [,2]
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [0,] 0.00000 1.16465 1.16255
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [1,] 1.00000 1.17094 1.16461
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [2,] 2.00000 1.16878 1.17084
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [3,] 3.00000 1.16525 1.16876
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [4,] 4.00000 1.16467 1.16525
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [5,] 5.00000 1.16491 1.16467
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [6,] 6.00000 1.16186 1.16498
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [7,] 7.00000 1.15985 1.16185
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [8,] 8.00000 1.16156 1.15985
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [9,] 9.00000 1.15447 1.16156
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  ArraySize 24
2020.03.23 11:40:11.328 00 (GBPUSD,H1)          [,0]    [,1]    [,2]
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [0,] 0.00000 1.16465 1.16255
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [1,] 1.00000 1.17094 1.16461
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [2,] 2.00000 1.16878 1.17084
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [3,] 5.00000 1.16491 1.16467
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [4,] 6.00000 1.16186 1.16498
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [5,] 7.00000 1.15985 1.16185
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [6,] 8.00000 1.16156 1.15985
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [7,] 9.00000 1.15447 1.16156
 
Alexey Viktorov:

Das ist Blödsinn. Ich habe diese Funktion genutzt, ohne das Handbuch zu lesen. Im Debugger habe ich gesehen, wie ein Element gelöscht und die Größe des Arrays sofort reduziert wird. Geprüft, auch auf ein Array von Strukturen funktioniert ohne Probleme. Jetzt kann ich nicht mit dem Code arbeiten, sondern nur mit Worten: Ich möchte zum Beispiel den 3. Es stellt sich heraus, dass der fünfte und sechste Wert entfernt werden müssen. Beim Kopieren ordnet die Funktion jedoch alle Werte in einem eindimensionalen Array an und es stellt sich heraus, dass das dritte Paar mit Index 5 beginnt. Dies wird in der Regel nach einigen Versuchen deutlich.

Wie für ArrayRemove, wenn ich kann, werde ich es auf 2-4 dimensionalen Arrays testen. Mangels Bedarf habe ich es nie getestet und hatte nicht den Verdacht, dass es nicht funktioniert.


Hinzugefügt:

Geprüft. Vergessen Sie nicht, dass Sie die Größe eines statischen Arrays nicht ändern können. Deshalb bleibt in dem Beispiel aus der Dokumentation die Größe des Arrays gleich und die letzten beiden Strings werden wiederholt. Wenn Sie Zeilen aus einem dynamischen Array löschen, ändert sich die Größe ohne Probleme.

Das Verzeichnis muss in die Löcher:)))) im Monitor geschrubbt werden.

Hier habe ich eine 3-dimensionale Anordnung und das Ergebnis erstellt:

Ihr Beispiel ist sehr langsam, was sich bei einer großen Anzahl von Werten bemerkbar machen wird.
 
Aliaksandr Hryshyn:
Ihr Beispiel ist sehr langsam, was sich bei einer großen Anzahl von Werten bemerkbar machen wird.

Mit einer Menge was? Array-Elemente, die nicht einmal bei jedem Tick gefüllt werden? Wie wird es sich bemerkbar machen?