恭喜,你发布的帖子
发布于 2016-01-12 00:10:43
1楼
源文件如下:(更改基于“条目号865058 Sample program for sorting a data block”源文件 )
敬请斧正!
FUNCTION "BubbleSortArray'sBYTEs" : VOID
TITLE =BubbleSortArray'sBytesInDB
//冒泡排序法:升序或者降序排列数据块中数组包含的字节元素
VERSION : 0.1
VAR_INPUT
Data_DB : BLOCK_DB ;
begin_addr : INT ; //begin address of array in DB
end_addr : INT ; //end address of array in DB
Up_or_Down : BOOL ; //ascending order(0) / descending order(1)
END_VAR
VAR_OUTPUT
err_word : WORD ;
err : BOOL ;
END_VAR
VAR_TEMP
Sort_done : BOOL ;
Temp : BYTE ;
Count : WORD ;
offset : DWORD ;
length : INT ;
END_VAR
BEGIN
NETWORK
TITLE =Sort a ARRAY in Data Block using the bubble sort method
//ARRAY in DB will be sorted in ascending order( Up_Down == FALSE ),
//ARRAY in DB will be sorted in descending order( Up_Down == TRUE ).
//
OPN #Data_DB; //Open Data Block
M001: L P#DBX 0.0; //start address in DB
LAR1 ;
SET ;
L #end_addr; //if (end_addr <= begin_addr)
L #begin_addr;
<=I ;
JC M004; //set faults outputs
L #end_addr; //calculate actual length of array
L #begin_addr;
-I ;
T #length;
L #length;
L W#16#1;
+I ;
T #length;
L #begin_addr;
SLD 3;
T #offset;
+AR1 ; //add offset to AR1
SET ; //LET #Sort_done = TRUE
S #Sort_done;
L #length;
L 1;
-I ;
Loop: T #Count; //FOR INDEX = Count TO length
SET ;
A #Up_or_Down; //descending order
JC M002;
L B [AR1,P#0.0]; //IF M(INDEX) > M(INDEX+1) THEN
L B [AR1,P#1.0];
<=I ;
JC M003;
// change M(INDEX+1) for M(INDEX)
L B [AR1,P#0.0]; //LET TEMP = M(INDEX)
T #Temp;
L B [AR1,P#1.0]; //LET M(INDEX) = M(INDEX+1)
T B [AR1,P#0.0];
L #Temp; //LET M(INDEX+1) = TEMP
T B [AR1,P#1.0];
SET ;
R #Sort_done; //LET #Sort_done = FALSE
JU M003;
M002: L B [AR1,P#0.0]; //IF M(INDEX) < M(INDEX+1) THEN
L B [AR1,P#1.0];
>=I ;
JC M003;
// change M(INDEX+1) for M(INDEX)
L B [AR1,P#0.0]; //LET TEMP = M(INDEX)
T #Temp;
L B [AR1,P#1.0]; //LET M(INDEX) = M(INDEX+1)
T B [AR1,P#0.0];
L #Temp; //LET M(INDEX+1) = TEMP
T B [AR1,P#1.0];
SET ;
R #Sort_done; //LET #Sort_done = FALSE
M003: TAR1 ;
L 8; //NEXT INDEX
+D ;
LAR1 ;
L #Count;
LOOP Loop; //End of sorting pass
AN #Sort_done; //If sorting is not done
JC M001; //Jump Conditionally to M002
R #err;
L #err_word;
L W#16#0;
AW ;
T #err_word;
SET ;
SAVE ;
BE ;
M004: SET ; //out err
= #err;
L W#16#1;
T #err_word;
BE ;
END_FUNCTION
请填写推广理由:
分享
只看
楼主