Beim sortieren der Blöcke in meinem DB schau ich mir immer nur das erste Byte im Block an und tausche anhand der größe (Wert) die einzelnen Blocke miteinander bis sie der Größe nach sortiert sind. (Bubblesort)
FUNCTION FC 100 : VOID
TITLE =Bubblesort
//14
AUTHOR : KAI
FAMILY : SPSFORUM
NAME : BUBBLE
VERSION : 1.0
VAR_INPUT
DB_NUMMER : INT ;
STARTADRESSE : INT ;
BLOCKGROESSE : INT ;
BLOCKANZAHL : INT ;
END_VAR
VAR_TEMP
DB_REGISTER : WORD ;
AR1_REGISTER : DWORD ;
DATENBLOCK_1 : ANY ;
DATENBLOCK_2 : ANY ;
SPEICHERBLOCK : ANY ;
BEREICHSZEIGER_1 : DWORD ;
BEREICHSZEIGER_2 : DWORD ;
OFFSET : DWORD ;
DB_NUMMER_TEMP : WORD ;
SCHLEIFE_1 : INT ;
SCHLEIFE_2 : INT ;
WERT_1 : INT ;
WERT_2 : INT ;
RETVAL : INT ;
END_VAR
BEGIN
NETWORK
TITLE =Register sichern
L DBNO; // DB-Register
T #DB_REGISTER;
TAR1 #AR1_REGISTER; // AR1-Register
NETWORK
TITLE =Datenblock 1 (ANY)
L P##DATENBLOCK_1; // Datenblock 1 (ANY)
LAR1 ;
L B#16#10; // Syntax-ID
T B [AR1,P#0.0];
L 2; // Datentyp
T B [AR1,P#1.0];
L #BLOCKGROESSE; // Anzahl
T W [AR1,P#2.0];
L #DB_NUMMER; // DB-Nummer
T W [AR1,P#4.0];
L #STARTADRESSE; // Bereichszeiger 1
ITD ;
SLD 3;
T D [AR1,P#6.0];
L B#16#84; // Operandenbereich
T B [AR1,P#6.0];
L D [AR1,P#6.0]; // Bereichszeiger 1
T #BEREICHSZEIGER_1;
NETWORK
TITLE =Datenblock 2 (ANY)
L P##DATENBLOCK_2; // Datenblock 2 (ANY)
LAR1 ;
L B#16#10; // Syntax-ID
T B [AR1,P#0.0];
L 2; // Datentyp
T B [AR1,P#1.0];
L #BLOCKGROESSE; // Anzahl
T W [AR1,P#2.0];
L #DB_NUMMER; // DB-Nummer
T W [AR1,P#4.0];
L #STARTADRESSE; // Bereichszeiger 2
L #BLOCKGROESSE;
+I ;
ITD ;
SLD 3;
T D [AR1,P#6.0];
L B#16#84; // Operandenbereich
T B [AR1,P#6.0];
L D [AR1,P#6.0]; // Bereichszeiger 2
T #BEREICHSZEIGER_2;
NETWORK
TITLE =Speicherblock (ANY)
L P##SPEICHERBLOCK; // Speicherblock (ANY)
LAR1 ;
L B#16#10; // Syntax-ID
T B [AR1,P#0.0];
L 2; // Datentyp
T B [AR1,P#1.0];
L #BLOCKGROESSE; // Anzahl
T W [AR1,P#2.0];
L #DB_NUMMER; // DB-Nummer
T W [AR1,P#4.0];
L #BLOCKGROESSE; // Bereichszeiger
L #BLOCKANZAHL;
*I ;
L #STARTADRESSE;
+I ;
ITD ;
SLD 3;
T D [AR1,P#6.0];
L B#16#84; // Operandenbereich
T B [AR1,P#6.0];
NETWORK
TITLE =Offset (Bereichszeiger)
L #BLOCKGROESSE;
ITD ;
SLD 3;
T #OFFSET;
NETWORK
TITLE =Bubblesort
L #DB_NUMMER; // DB-Nummer
T #DB_NUMMER_TEMP;
AUF DB [#DB_NUMMER_TEMP];
L #BLOCKANZAHL;
L 1;
-I ;
M01: T #SCHLEIFE_1;
L P##DATENBLOCK_1; // Datenblock 1 (ANY)
LAR1 ;
L #BEREICHSZEIGER_1; // Bereichszeiger 1
T D [AR1,P#6.0];
L P##DATENBLOCK_2; // Datenblock 2 (ANY)
LAR1 ;
L #BEREICHSZEIGER_2; // Bereichszeiger 2
T D [AR1,P#6.0];
L #SCHLEIFE_1;
M02: T #SCHLEIFE_2;
L P##DATENBLOCK_1; // Datenblock 1 (ANY)
LAR1 ;
L D [AR1,P#6.0]; // Bereichszeiger
LAR1 ;
L B [AR1,P#0.0]; // Wert 1
T #WERT_1;
L P##DATENBLOCK_2; // Datenblock 2 (ANY)
LAR1 ;
L D [AR1,P#6.0]; // Bereichszeiger
LAR1 ;
L B [AR1,P#0.0]; // Wert 2
T #WERT_2;
L #WERT_2; // Wert 2
L #WERT_1; // Wert 1
>I ;
SPBN M03;
NETWORK
TITLE =Bubblesort
CALL SFC 20 (
SRCBLK := #DATENBLOCK_1,
RET_VAL := #RETVAL,
DSTBLK := #SPEICHERBLOCK);
NOP 0;
NETWORK
TITLE =Bubblesort
CALL SFC 20 (
SRCBLK := #DATENBLOCK_2,
RET_VAL := #RETVAL,
DSTBLK := #DATENBLOCK_1);
NOP 0;
NETWORK
TITLE =Bubblesort
CALL SFC 20 (
SRCBLK := #SPEICHERBLOCK,
RET_VAL := #RETVAL,
DSTBLK := #DATENBLOCK_2);
NOP 0;
NETWORK
TITLE =Bubblesort
M03: L P##DATENBLOCK_1; // Datenblock 1 (ANY)
LAR1 ;
L D [AR1,P#6.0]; // Bereichszeiger
L #OFFSET; // Offset
+D ;
T D [AR1,P#6.0];
L P##DATENBLOCK_2; // Datenblock 2 (ANY)
LAR1 ;
L D [AR1,P#6.0]; // Bereichszeiger
L #OFFSET; // Offset
+D ;
T D [AR1,P#6.0];
L #SCHLEIFE_2;
LOOP M02;
L #SCHLEIFE_1;
LOOP M01;
NETWORK
TITLE =Register wiederherstellen
AUF DB [#DB_REGISTER]; // DB-Register
LAR1 #AR1_REGISTER; // AR1-Register
END_FUNCTION
ob das aber der sinn der sache ist, lasse ich mal dahingestellt.
du solltest verstehen was du da programmierst und nicht einfach irgendeinen code übernehmen.
beim nächsten problem fängt das gleiche spiel hier wieder von vorne an.
FUNCTION FC 100 : VOID
TITLE =Bubblesort
//14
AUTHOR : KAI
FAMILY : SPSFORUM
NAME : BUBBLE
VERSION : 1.0
VAR_INPUT
DB_NUMMER : INT ;
STARTADRESSE : INT ;
BLOCKGROESSE : INT ;
BLOCKANZAHL : INT ;
END_VAR
VAR_TEMP
DB_REGISTER : WORD ;
AR1_REGISTER : DWORD ;
DATENBLOCK_1 : ANY ;
DATENBLOCK_2 : ANY ;
SPEICHERBLOCK : ANY ;
DB_NUMMER_TEMP : WORD ;
BEREICHSZEIGER_1 : DWORD ;
BEREICHSZEIGER_2 : DWORD ;
OFFSET : DWORD ;
SCHLEIFE_1 : INT ;
SCHLEIFE_2 : INT ;
WERT_1 : INT ;
WERT_2 : INT ;
RETVAL : INT ;
END_VAR
BEGIN
NETWORK
TITLE =Register sichern
L DBNO; // DB-Register
T #DB_REGISTER;
TAR1 #AR1_REGISTER; // AR1-Register
NETWORK
TITLE =Datenblock 1 (ANY)
L P##DATENBLOCK_1; // Datenblock 1 (ANY)
LAR1 ;
L B#16#10; // Syntax-ID
T B [AR1,P#0.0];
L 2; // Datentyp
T B [AR1,P#1.0];
L #BLOCKGROESSE; // Anzahl
T W [AR1,P#2.0];
L #DB_NUMMER; // DB-Nummer
T W [AR1,P#4.0];
L #STARTADRESSE; // Bereichszeiger
ITD ;
SLD 3;
T D [AR1,P#6.0];
L B#16#84; // Operandenbereich
T B [AR1,P#6.0];
NETWORK
TITLE =Datenblock 2 (ANY)
L P##DATENBLOCK_2; // Datenblock 2 (ANY)
LAR1 ;
L B#16#10; // Syntax-ID
T B [AR1,P#0.0];
L 2; // Datentyp
T B [AR1,P#1.0];
L #BLOCKGROESSE; // Anzahl
T W [AR1,P#2.0];
L #DB_NUMMER; // DB-Nummer
T W [AR1,P#4.0];
L #STARTADRESSE; // Bereichszeiger
L #BLOCKGROESSE;
+I ;
ITD ;
SLD 3;
T D [AR1,P#6.0];
L B#16#84; // Operandenbereich
T B [AR1,P#6.0];
NETWORK
TITLE =Speicherblock (ANY)
L P##SPEICHERBLOCK; // Speicherblock (ANY)
LAR1 ;
L B#16#10; // Syntax-ID
T B [AR1,P#0.0];
L 2; // Datentyp
T B [AR1,P#1.0];
L #BLOCKGROESSE; // Anzahl
T W [AR1,P#2.0];
L #DB_NUMMER; // DB-Nummer
T W [AR1,P#4.0];
L #BLOCKGROESSE; // Bereichszeiger
L #BLOCKANZAHL;
*I ;
L #STARTADRESSE;
+I ;
ITD ;
SLD 3;
T D [AR1,P#6.0];
L B#16#84; // Operandenbereich
T B [AR1,P#6.0];
NETWORK
TITLE =Bubblesort
L #DB_NUMMER;
T #DB_NUMMER_TEMP;
AUF DB [#DB_NUMMER_TEMP];
L P##DATENBLOCK_1; // Datenblock 1 (ANY)
LAR1 ;
L D [AR1,P#6.0]; // Bereichszeiger 1
T #BEREICHSZEIGER_1;
L P##DATENBLOCK_2; // Datenblock 2 (ANY)
LAR1 ;
L D [AR1,P#6.0]; // Bereichszeiger 2
T #BEREICHSZEIGER_2;
L #BLOCKGROESSE; // Offset
ITD ;
SLD 3;
T #OFFSET;
L #BLOCKANZAHL;
L 1;
-I ;
M01: T #SCHLEIFE_1;
L P##DATENBLOCK_1; // Datenblock 1 (ANY)
LAR1 ;
L #BEREICHSZEIGER_1; // Bereichszeiger 1
T D [AR1,P#6.0];
L P##DATENBLOCK_2; // Datenblock 2 (ANY)
LAR1 ;
L #BEREICHSZEIGER_2; // Bereichszeiger 2
T D [AR1,P#6.0];
L #SCHLEIFE_1;
M02: T #SCHLEIFE_2;
L P##DATENBLOCK_1; // Datenblock 1 (ANY)
LAR1 ;
L D [AR1,P#6.0]; // Bereichszeiger
LAR1 ;
L B [AR1,P#0.0]; // Wert 1
T #WERT_1;
L P##DATENBLOCK_2; // Datenblock 2 (ANY)
LAR1 ;
L D [AR1,P#6.0]; // Bereichszeiger
LAR1 ;
L B [AR1,P#0.0]; // Wert 2
T #WERT_2;
L #WERT_2; // Wert 2
L #WERT_1; // Wert 1
>I ;
SPBN M03;
NETWORK
TITLE =Bubblesort
CALL SFC 20 (
SRCBLK := #DATENBLOCK_1,
RET_VAL := #RETVAL,
DSTBLK := #SPEICHERBLOCK);
NOP 0;
NETWORK
TITLE =Bubblesort
CALL SFC 20 (
SRCBLK := #DATENBLOCK_2,
RET_VAL := #RETVAL,
DSTBLK := #DATENBLOCK_1);
NOP 0;
NETWORK
TITLE =Bubblesort
CALL SFC 20 (
SRCBLK := #SPEICHERBLOCK,
RET_VAL := #RETVAL,
DSTBLK := #DATENBLOCK_2);
NOP 0;
NETWORK
TITLE =Bubblesort
M03: L P##DATENBLOCK_1; // Datenblock 1 (ANY)
LAR1 ;
L D [AR1,P#6.0]; // Bereichszeiger
L #OFFSET; // Offset
+D ;
T D [AR1,P#6.0];
L P##DATENBLOCK_2; // Datenblock 2 (ANY)
LAR1 ;
L D [AR1,P#6.0]; // Bereichszeiger
L #OFFSET; // Offset
+D ;
T D [AR1,P#6.0];
L #SCHLEIFE_2;
LOOP M02;
L #SCHLEIFE_1;
LOOP M01;
NETWORK
TITLE =Register wiederherstellen
AUF DB [#DB_REGISTER]; // DB-Register
LAR1 #AR1_REGISTER; // AR1-Register
END_FUNCTION
ich kenne deine meinung dazuMeine Meinung zu dem Thema kannst Du hier nachlesen:
Bin beim stöbern auf die Sortierfunktion gestossen und hab ein wenig damit herumgespielt. Ich würde gern ca 50 -100 Datenblöcke, bestehend aus je 2 Dint-Werten sortieren.
FUNCTION FC 100 : VOID
TITLE =Bubblesort
AUTHOR : KAI
FAMILY : SPSFORUM
NAME : BUBBLE
VERSION : 1.0
VAR_INPUT
DATENBAUSTEIN : BLOCK_DB ;
STARTADRESSE : INT ;
BLOCKANZAHL : INT ;
END_VAR
VAR_TEMP
DB_REGISTER : WORD ;
AR1_REGISTER : DWORD ;
BEREICHSZEIGER : DWORD ;
SCHLEIFE_1 : INT ;
SCHLEIFE_2 : INT ;
END_VAR
BEGIN
NETWORK
TITLE =Register sichern
L DBNO; // DB-Register
T #DB_REGISTER;
TAR1 #AR1_REGISTER; // AR1-Register
NETWORK
TITLE =Bubblesort
AUF #DATENBAUSTEIN; // Datenbaustein
L #STARTADRESSE; // Startadresse
ITD ;
SLD 3;
T #BEREICHSZEIGER; // Bereichszeiger
L #BLOCKANZAHL; // Blockanzahl
L 1;
-I ;
M01: T #SCHLEIFE_1;
L #BEREICHSZEIGER; // Bereichszeiger
LAR1 ;
L #SCHLEIFE_1;
M02: T #SCHLEIFE_2;
L DBD [AR1,P#8.0]; // Wert 2-1
L DBD [AR1,P#0.0]; // Wert 1-1
>D ;
SPBN M03;
L DBD [AR1,P#0.0]; // Wert 1-1
L DBD [AR1,P#8.0]; // Wert 2-1
T DBD [AR1,P#0.0]; // Wert 2-1 => Wert 1-1
TAK ;
T DBD [AR1,P#8.0]; // Wert 1-1 => Wert 2-1
L DBD [AR1,P#4.0]; // Wert 1-2
L DBD [AR1,P#12.0]; // Wert 2-2
T DBD [AR1,P#4.0]; // Wert 2-2 => Wert 1-2
TAK ;
T DBD [AR1,P#12.0]; // Wert 1-2 => Wert 2-2
M03: L P#8.0;
+AR1 ;
L #SCHLEIFE_2;
LOOP M02;
L #SCHLEIFE_1;
LOOP M01;
NETWORK
TITLE =Register wiederherstellen
AUF DB [#DB_REGISTER];
LAR1 #AR1_REGISTER;
END_FUNCTION
n * (n - 1)
Vergleiche = (n - 1) + (n - 2) + ... + 1 = -----------
2
Durchläufe = (n - 1) = (100 - 1) = 99
n * (n - 1) 100 * (100 - 1)
Vergleiche = ----------- = --------------- = 4950
2 2
Allerdings hab ich die Funktion aus den PDFs entnommen, in der Zip-Datei ist ein anderer Baustein.
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?