Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Results 1 to 6 of 6

Thread: Array sortieren

  1. #1
    Join Date
    05.01.2014
    Posts
    11
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Default


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Community,
    ich habe ein Array und möchte die Elemente, deren Inhalt Null ist, aufrücken. Die übrigen Elemente müssen nicht sortiert oder geordnet werden.

    array[0] -> 0
    array[1] -> 4
    array[2] -> 2
    array[3] -> 3
    array[n] -> 0

    wird zu

    array[0] -> 4
    array[1] -> 2
    array[2] -> 3
    array[3] -> 0
    array[n] -> 0

    Ich habe dies mit einer for Schleife gelöst.
    Gibt es für solche Anwendungen Sortieralgorithmen? Meine Lösung kommt mir sehr langsam vor.

    Vielen Dank
    Reply With Quote Reply With Quote Array sortieren  

  2. #2
    Join Date
    22.06.2009
    Location
    Sassnitz
    Posts
    13,613
    Danke
    1,094
    Erhielt 4,025 Danke für 3,253 Beiträge

    Default

    Hallo

    FOR-Schleife klingt erst mal nicht verkehrt. Eine fertige Lösung für das Aufrücken/Konzentrieren der belegten Werte kenne ich nicht. Im Grunde muß die Schleife nur suchen, ob nach einem 0-Wert noch Wert(e) <> 0 kommen und diese ggf. aufrücken und am Ende die aufgerückten Elemente auf 0 löschen.

    In welcher Programmiersprache für welches Gerät brauchst Du die Lösung?
    Wie groß ist das Array (Anzahl Elemente)?
    Wie langsam ist "gefühlt langsam"?
    Wie häufig soll das "Aufrücken" ausgeführt werden?
    Sind da statistisch mehr Inhalte = 0 oder mehr <> 0?
    Wodurch entstehen die "Lücken" (die 0-Werte)?

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  3. #3
    Join Date
    22.03.2007
    Location
    Detmold (im Lipperland)
    Posts
    12,224
    Danke
    411
    Erhielt 2,506 Danke für 2,084 Beiträge

    Default

    Um beurteilen zu können ob man etwas optimieren kann müßte man deinen Code sehen.
    Zum Sortieren würde ich den Bubblesort-Algorithmus nehmen - der ist natürlich bei sehr vielen Elementen nicht unbedingt eine Rakete.
    Wieviele Elemente sortiertst du denn in welchem Zeitintervall (also wie oft) ?

    Gruß
    Larry

  4. #4
    Join Date
    22.06.2009
    Location
    Sassnitz
    Posts
    13,613
    Danke
    1,094
    Erhielt 4,025 Danke für 3,253 Beiträge

    Default

    Quote Originally Posted by PN/DP View Post
    Im Grunde muß die Schleife nur suchen, ob nach einem 0-Wert noch Wert(e) <> 0 kommen und diese ggf. aufrücken und am Ende die aufgerückten Elemente auf 0 löschen.
    Einfache Variante (in SCL/ST) mit ggf. auf sich selbst kopieren (kann effizienter sein als zusätzlich Kopier-Einsparungen (Index-Differenz) zu testen und Aufrückungen mitzuzählen. Ausführungszeit ist immer ungefähr gleich lang: jedes Array-Element wird einmal gelesen und einmal geschrieben):
    Code:
    a : ARRAY [0..imax] OF INT;
    ir : UINT; //Read-Index
    iw : UINT; //Write-Index
    
    
    iw := 0;                //Schreib-Index auf erstes Element setzen
    
    FOR ir := 0 TO imax DO  //jedes Array-Element einmal lesen
      IF a[ir] <> 0 THEN    //Element mit einem Wert belegt?
        a[iw] := a[ir];     //Element (um)kopieren
        iw := iw + 1;       //Schreib-Index auf nächstes Element
      END_IF;
    END_FOR;
    
    WHILE iw <= imax DO      //in Ausgabe-Array nicht belegte Elemente löschen
      a[iw] := 0;
      iw := iw + 1;
    END_WHILE;
    Je nach Compiler kann es effizienter sein, für den gelesenen Array-Wert eine Zwischenspeicher-Variable zu verwenden:
    Code:
    ...
      v := a[ir];
      IF v <> 0 THEN
        a[iw] := v;         //Element (um)kopieren
    ...
    Harald
    Last edited by PN/DP; 13.05.2019 at 13:39.
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  5. #5
    MrChipsy is offline Neuer Benutzer
    Themenstarter
    Join Date
    05.01.2014
    Posts
    11
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Default

    Nachfolgend mein Code:
    Code:
     
        IF StartSorting THEN
    StartSorting := FALSE;
    xtmp:=0; FOR xcnt:=0 TO LAST_INDEX DO IF ArrayIn[xcnt] <> 0 THEN ArrayTmp[xtmp]:=ArrayIn[xcnt]; xtmp:=xtmp+1; END_IF IF xcnt = LAST_INDEX THEN ArrayIn:=ArrayOut:=ArrayTmp; brsmemset(ADR(ArrayTmp),0,SIZEOF(ArrayTmp)); xtmp:=0; END_IF END_FOR END_IF
    Ich sortiere bis zu 2000 Elemente. Geschwindigkeit ist relativ, mir erscheint es langsam.
    Die Task, in der das Sortieren durchgeführt wird, werde ich aufräumen.
    Last edited by MrChipsy; 14.05.2019 at 09:48.

  6. #6
    Join Date
    22.06.2009
    Location
    Sassnitz
    Posts
    13,613
    Danke
    1,094
    Erhielt 4,025 Danke für 3,253 Beiträge

    Default


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Oha, da ist in der Tat einiger zeitfressender Code am Ende der FOR-Schleife enthalten, und korrekt funktionieren tut der Code eigentlich auch nicht (hast Du zum hier posten noch Code weggekürzt?)

    Wenn Du schon das ganze ArrayTmp mit 0 initialisierst, dann muß das VOR der FOR-Schleife passieren und nicht danach. Effizienter ist aber, nach der FOR-Schleife nur noch die nicht belegten Arrayelemente auf 0 zu löschen (von ArrayTmp[xtmp] bis ArrayTmp[LAST_INDEX]).
    Warum sortierst Du nicht direkt das ArrayIn, sondern sortierst in ein ArrayTmp und kopierst das ArrayTmp dann zweimal (in das ArrayIn zurück und in ein zusätzliches ArrayOut)? Das ArrayTmp erscheint mir völlig unnötig. Du könntest auch von ArrayIn direkt nach ArrayOut sortieren.

    Der ganze Code "IF xcnt = LAST_INDEX THEN ... END_IF" gehört hinter das END_FOR, und dort kann das IF dann auch entfallen. Das "xtmp:=0;" am Ende ist unnötig.

    Probiere mal meinen Code aus #4, der eigentlich auch nichts anderes macht wie Dein Code, nur nicht so aufwändig.

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

Similar Threads

  1. ARRAY sortieren
    By veritaz89 in forum CODESYS und IEC61131
    Replies: 5
    Last Post: 07.06.2012, 07:40
  2. Array sortieren
    By veritaz89 in forum CODESYS und IEC61131
    Replies: 2
    Last Post: 05.06.2012, 08:38
  3. Strukturkomponenten sortieren
    By nutellahase in forum Simatic
    Replies: 0
    Last Post: 07.09.2011, 07:29
  4. Array-Daten sortieren
    By L.T. in forum CODESYS und IEC61131
    Replies: 1
    Last Post: 17.03.2009, 22:09
  5. VAT sortieren?
    By Anonymous in forum Simatic
    Replies: 1
    Last Post: 03.01.2006, 11:23

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •