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

Ergebnis 1 bis 2 von 2

Thema: DB Bubble Sort

  1. #1
    Registriert seit
    24.02.2007
    Beiträge
    9
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Also, ich habe einen Datenbaustein in den ich Werte von 1 bis 3 speichere ...
    Nun will ich diese abhängig von einem Eingang aufsteigend oder absteigend sortieren...

    Code:
    ORGANIZATION_BLOCK OB 1
    TITLE = "Main Program Sweep (Cycle)"
    VERSION : 0.1
    
    
    VAR_TEMP
      OB1_EV_CLASS : BYTE ;    //Bits 0-3 = 1 (Coming event), Bits 4-7 = 1 (Event class 1)
      OB1_SCAN_1 : BYTE ;    //1 (Cold restart scan 1 of OB 1), 3 (Scan 2-n of OB 1)
      OB1_PRIORITY : BYTE ;    //Priority of OB Execution
      OB1_OB_NUMBR : BYTE ;    //1 (Organization block 1, OB1)
      OB1_RESERVED_1 : BYTE ;    //Reserved for system
      OB1_RESERVED_2 : BYTE ;    //Reserved for system
      OB1_PREV_CYCLE : INT ;    //Cycle time of previous OB1 scan (milliseconds)
      OB1_MIN_CYCLE : INT ;    //Minimum cycle time of OB1 (milliseconds)
      OB1_MAX_CYCLE : INT ;    //Maximum cycle time of OB1 (milliseconds)
      OB1_DATE_TIME : DATE_AND_TIME ;    //Date and time OB1 started
    END_VAR
    BEGIN
    NETWORK
    TITLE =
    
    
          CALL FC   1 (
               Data_DB          :=DB 1,
               DB_length        :=W#16#A) ;
               
    NETWORK
    TITLE =
    
          AUF   DB     1; 
    
    NETWORK
    TITLE =
    
          U(    ; 
          O     E      0.0; 
          O     E      0.1; 
          O     E      0.2; 
          )     ; 
          ZV    Z      0; 
          U(    ; 
          O     E      1.0; 
          O     E      1.1; 
          O     E      1.2; 
          )     ; 
          U     E      2.0; 
          ZR    Z      0; 
          NOP   0; 
          NOP   0; 
          U(    ; 
          L     DBW    0; 
          L     0; 
          ==I   ; 
          )     ; 
    
    
    
    
          R     Z      0; 
          NOP   0; 
          LC    Z      0; 
          T     MW    10; 
          NOP   0; 
    NETWORK
    TITLE =
    
    
          U     E      0.0; 
          SPBNB _001; 
          L     1; 
          T     MW    30; 
    _001: NOP   0; 
    NETWORK
    TITLE =
    
    
    
          U     E      0.1; 
          SPBNB _002; 
          L     2; 
          T     MW    30; 
    _002: NOP   0; 
    NETWORK
    TITLE =
    
    
    
          U     E      0.2; 
          SPBNB _003; 
          L     3; 
          T     MW    30; 
    _003: NOP   0; 
    NETWORK
    TITLE =
    
    
    
    
    
    
    
          U(    ; 
          O     E      0.0; 
          O     E      0.1; 
          O     E      0.2; 
          )     ; 
          SPBNB _010; 
          CALL FC     2 ;
    _010: NOP   0; 
    NETWORK
    TITLE =
    
          U(    ; 
          O     E      1.0; 
          O     E      1.1; 
          O     E      1.2; 
          )     ; 
          U     E      2.0; 
          FP    M    220.1; 
          SPBN  M001; 
    
          CALL "BLKMOV" (
               SRCBLK                   := P#DBX 2.0 BYTE 100,
               RET_VAL                  := MW   110,
               DSTBLK                   := P#DBX 0.0 BYTE 100);
    
    M001: NOP   0; 
    NETWORK
    TITLE =
    
    
    
    END_ORGANIZATION_BLOCK
    Nun habe ich einen DB Bubble Sort Baustein der wie folgt aussieht :

    Code:
    FUNCTION FC 1 : VOID
    TITLE =
    VERSION : 0.1
    
    
    VAR_INPUT
      Data_DB : BLOCK_DB ;  
      DB_length : WORD ;    
    END_VAR
    VAR_TEMP
      Sort_done : BOOL ;    
      Temp : WORD ; 
      Count : WORD ;    
    END_VAR
    BEGIN
    NETWORK
    TITLE =Sort a Data Block using the bubble sort method
    //Data Block will be sorted in ascending order.
    //
          AUF   #Data_DB; //Open Data Block
    M002: LAR1  P#DBX 0.0; 
          SET   ; //LET #Sort_done = TRUE
          S     #Sort_done; 
          L     #DB_length; 
          L     1; 
          -I    ; 
    Loop: T     #Count; //FOR INDEX = Count TO DB_length
          L     W [AR1,P#0.0]; //IF M(INDEX) > M(INDEX+1) THEN
          L     W [AR1,P#2.0]; 
          <=I   ; 
          SPB   M003; 
    // change M(INDEX+1) for  M(INDEX)
          L     W [AR1,P#0.0]; //LET TEMP = M(INDEX)
          T     #Temp; 
          L     W [AR1,P#2.0]; //LET M(INDEX) = M(INDEX+1)
          T     W [AR1,P#0.0]; 
          L     #Temp; //LET M(INDEX+1) = TEMP
          T     W [AR1,P#2.0]; 
          SET   ; 
          R     #Sort_done; //LET #Sort_done = FALSE
    M003: TAR1  ; 
          L     16; //NEXT INDEX
          +D    ; 
          LAR1  ; 
          L     #Count; 
          LOOP  Loop; //End of sorting pass
          UN    #Sort_done; //If sorting is not done
          SPB   M002; //Jump Conditionally to M002
          BE    ; 
    
    
    END_FUNCTION
    Jetzt habe ich das Problem, dass das zweite Wort im DB immer bestehen bleibt ... bekomm ich nicht mehr zu einer Null ...
    Und beim speichern der ersten Zahl schreibt er sie mir direkt in Wort 1 und 2 ...
    Ich bin verzweifelt ....
    Zitieren Zitieren DB Bubble Sort  

  2. #2
    Registriert seit
    19.06.2003
    Beiträge
    2.200
    Danke
    85
    Erhielt 259 Danke für 175 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von TheBigMemph Beitrag anzeigen
    Also, ich habe einen Datenbaustein in den ich Werte von 1 bis 3 speichere ...
    Wenn es nur drei Werte sind, brauchst du keine Schleife und keine Pointer, das kannst du auch zu Fuß machen:
    Code:
    L DBW 1
    L DBW 2
    >I
    SBP OK1 //nicht tauschen
    T DBW1 
    TAK 
    T DBW2
    OK1:NOP 0
    
    L DBW 2
    L DBW 3
    >I
    SBP OK2 //nicht tauschen
    T DBW2 
    TAK 
    T DBW3
    OK2:NOP 0
    
    L DBW 1
    L DBW 2
    >I
    SBP OK3 //nicht tauschen
    T DBW1 
    TAK 
    T DBW2
    OK3:NOP 0
    Zitat Zitat von TheBigMemph Beitrag anzeigen
    Nun will ich diese abhängig von einem Eingang aufsteigend oder absteigend sortieren...
    Das mit dem Eingang hatte ich überlesen. Einfach bei Bedarf den Vergleich invertieren:
    Code:
    L DBW 1
    L DBW 2
    >I
    X E0.0
    SBP OK1 //nicht tauschen
    ...
    Zitat Zitat von TheBigMemph Beitrag anzeigen
    Ich bin verzweifelt ....
    Ansonsten benutzer mal die Suchfunktion. Irgendwann habe ich schon mal Code für Bublesort gepostet.

  3. Folgender Benutzer sagt Danke zu Zottel für den nützlichen Beitrag:

    TheBigMemph (20.03.2007)

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •