0-255 Byte umkehren
CODESYS Forge
talk
(Thread)
0-255 Byte umkehren
Last updated: 2020-08-30
Network Byte Orders
CODESYS Forge
talk
(Thread)
Network Byte Orders
Last updated: 2021-01-12
Byte in String
CODESYS Forge
talk
(Thread)
Byte in String
Last updated: 2006-04-26
bits into Byte
CODESYS Forge
talk
(Thread)
bits into Byte
Last updated: 2022-11-28
High-/Low-Byte vertauschen
CODESYS Forge
talk
(Thread)
High-/Low-Byte vertauschen
Last updated: 2007-09-17
T_x_can_msg & one-byte messages
CODESYS Forge
talk
(Thread)
T_x_can_msg & one-byte messages
Last updated: 2017-07-13
das Bit im Byte
CODESYS Forge
talk
(Thread)
das Bit im Byte
Last updated: 2010-02-17
array table and combo box array multitouch problem
CODESYS Forge
talk
(Thread)
array table and combo box array multitouch problem
Last updated: 2018-04-23
Write one dimensional array into two dimensional array
CODESYS Forge
talk
(Thread)
Write one dimensional array into two dimensional array
Last updated: 2022-02-25
Post by timvh on Configuring a 2's compliment
CODESYS Forge
talk
(Post)
You could create a DUT of the Type Union and add an array of 2 bytes + an Int. Then write the byte values in the array of the Union and read the Int. Or VAR iInt : INT; byHigh : BYTE := 2#1111_1111; byLow : BYTE := 2#1111_1111; END_VAR iInt := TO_INT(byHigh*16#100 + byLow);
Last updated: 2024-09-28
Post by ihatemaryfisher on Sorting array of any-sized structure
CODESYS Forge
talk
(Post)
In my machine's operation, I need to display multiples tables containing arrays of structured variables. The arrays change during operation, and my supervisor has advised me to write a new bubble-sort for each array. I think I can make a function to sort an array of any data type. This was my own project, and I'm a relatively new coder. I want to know the weaknesses in my approach, and a better method, if one exists. As far as I can test, the function accepts an array of a structured variable of any size, and sort it by any VAR in that structure. But it relies heavily on pointers, which I've heard are bad practice? Function call: // SORT BY BYTE-SIZED VAR IF xDoIt[6] THEN FUNBubbleSortSansBuffer( IN_pbySourcePointer := ADR(astArray[1]), // address of first byte in first element of array IN_pbyComparePointer:= ADR(astArray[1].byCompByte), // points to first byte of the comparing variable (variable you sort by) IN_uiStructureSize := SIZEOF(TYPE_STRUCTURE), // size, in bytes, of the structured variable IN_uiCompareSize := SIZEOF(astArray[1].byCompByte), // size, in bytes, of the comparing variable (variable you sort by) diArrayElements := UPPER_BOUND(astArray,1), // number of elements in array IN_xSmallToLarge := xSortOrder // whether to sort by small2large or large2small ); END_IF Function: FUNCTION FUNBubbleSortSansBuffer : BOOL VAR_INPUT IN_pbySourcePointer : POINTER TO BYTE; // points to beginning of array (first byte of first element) IN_pbyComparePointer: POINTER TO BYTE; // points to first byte of the comparing variable (variable you sort by) IN_uiStructureSize : UINT; // size, in bytes, of the structured variable IN_uiCompareSize : UINT; // size, in bytes, of the comparing variable (variable you sort by) diArrayElements : DINT; // number of elements in array IN_xSmallToLarge : BOOL; // whether to sort by small2large or large2small END_VAR VAR j : DINT; // repeat iteration over array until array ends i : DINT; // iterarte over array, swapping when necesary k : DINT; // iterator from 1 to size of structure (stepping 'through' a single element in array) dwSize : DWORD; // internal var for use in MEMUtils.MemCpy(<size>) // FOR SORTING BY BYTE VAR pbySourcePointer : POINTER TO BYTE; pbySourcePointer2 : POINTER TO BYTE; pbyComparePointer : POINTER TO BYTE; pbyComparePointer2 : POINTER TO BYTE; pbyPointerToBuffer : POINTER TO BYTE; // pointer to single byte buffer byBufferByte : BYTE; // single byte buffer END_VAR dwSize := UINT_TO_DWORD(IN_uiStructureSize); // get structure size (number of bytes) pbyPointerToBuffer := ADR(byBufferByte); // assign pointer to address of buffer byte (because MEMUtils.MemCpy requires a pointer input) CASE IN_uiCompareSize OF // depending on the size of the VAR to sort by (current functionality for BYTE and WORD/INT 1: // BYTE (8 BIT) FOR j := 1 TO diArrayElements DO // for number of elements in array FOR i := 1 TO (diArrayElements-1) DO // same thing, but row[i+1] row is included in swap logic pbySourcePointer := IN_pbySourcePointer + dwSize*(i-1); // point at #1 byte in array element[i] pbySourcePointer2 := pbySourcePointer + dwSize; // point at #1 byte in array element[i+1] // NOTE: because of memory locations, each array element is offset from one another by a number of bytes equal to the size of the structure // We can "walk" from array[i] to array[i+1] via steps equal to the size of the structure // e.g., ADR(array[i+1]) == ADR(array[i]) + SIZEOF([array datatype]) pbyComparePointer := IN_pbyComparePointer + dwSize*(i-1); // point to sorting variable in array element[i] pbyComparePointer2 := pbyComparePointer + dwSize; // point to sorting variable in array element[i+1] // using sort order (small -> large/large -> small) IF SEL(IN_xSmallToLarge, (pbyComparePointer2^ > pbyComparePointer^),(pbyComparePointer2^ < pbyComparePointer^)) THEN // This is where it gets tricky. We've identified pointers for the starting bytes of aArray[i] and aArray[i+1] // and we know the size of aArray[i]. We are going to swap individual bytes, one at a time, from aArray[i] and aArray[i+1] // this allows us to use only a single byte var as a buffer or temporary data storage // e.g., consider a structure consisting of a word, a byte, and a string. it is stored like this // |------WORD-------| |--BYTE-| |STRING------...| // astArray[1] == 1000 0100 0010 0001 1100 0011 1010 1010.... etc // astArray[2] == 0001 0010 0100 1000 0011 1100 0101 0101.... etc // performing a single swap (copy into a buffer, etc.) of the first byte of each array element creates this // astArray[1] == 0001 0100 0010 0001 1100 0011 1010 1010.... etc // astArray[2] == 1000 0010 0100 1000 0011 1100 0101 0101.... etc // incrementing the pointer adresses for the swap by 1 and swapping again swaps the next byte in each array element // astArray[1] == 0001 0010 0010 0001 1100 0011 1010 1010.... etc // astArray[2] == 1000 0100 0100 1000 0011 1100 0101 0101.... etc // continuing this from k to SIZEOF(TYPE_STRUCTURE) results in a toally swapped row FOR k := 1 TO IN_uiStructureSize DO // copy single byte[k] of array element 1 to buffer MEMUtils.MemCpy(pbyDest := (pbyPointerToBuffer), pbySrc := (pbySourcePointer+k-1), dwSize := 1); // copy single byte[k] of array element 2 to 1 MEMUtils.MemCpy(pbyDest := pbySourcePointer+k-1, pbySrc := (pbySourcePointer2+k-1), dwSize := 1); // copy buffer to byte[k] array element 2 MEMUtils.MemCpy(pbyDest := (pbySourcePointer2+k-1), pbySrc := pbyPointerToBuffer, dwSize := 1); END_FOR END_IF END_FOR END_FOR
Last updated: 2023-08-17
ARRAY of unknow struct
CODESYS Forge
talk
(Thread)
ARRAY of unknow struct
Last updated: 2017-10-09
TwinCAT ARRAY
CODESYS Forge
talk
(Thread)
TwinCAT ARRAY
Last updated: 2018-08-16
In Array suchen
CODESYS Forge
talk
(Thread)
In Array suchen
Last updated: 2010-12-22
Array Deklaration über Konstante
CODESYS Forge
talk
(Thread)
Array Deklaration über Konstante
Last updated: 2012-07-30
ARRAY [*] OF in PLCopenXML
CODESYS Forge
talk
(Thread)
ARRAY [*] OF in PLCopenXML
Last updated: 2018-10-26
ARRAY beschreiben
CODESYS Forge
talk
(Thread)
ARRAY beschreiben
Last updated: 2008-04-07
ARRAY ALS FESTER SPEICHER
CODESYS Forge
talk
(Thread)
ARRAY ALS FESTER SPEICHER
Last updated: 2009-05-13
Array größe bestimmen.
CODESYS Forge
talk
(Thread)
Array größe bestimmen.
Last updated: 2008-01-05
Increas Array Element
CODESYS Forge
talk
(Thread)
Increas Array Element
Last updated: 2023-06-17
String array corruption
CODESYS Forge
talk
(Thread)
String array corruption
Last updated: 2012-01-31
[2D ARRAY] [FB]
CODESYS Forge
talk
(Thread)
[2D ARRAY] [FB]
Last updated: 2021-07-03
Array declaration with FB_Init
CODESYS Forge
talk
(Thread)
Array declaration with FB_Init
Last updated: 2020-08-21
array
CODESYS Forge
talk
(Thread)
array
Last updated: 2021-04-08
Pointer To Array
CODESYS Forge
talk
(Thread)
Pointer To Array
Last updated: 2021-02-04
To search for an exact phrase, put it in quotes. Example: "getting started docs"
To exclude a word or phrase, put a dash in front of it. Example: docs -help
To search on specific fields, use these field names instead of a general text search. You can group with AND
or OR
.