<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en" xmlns="http://www.w3.org/2005/Atom"><title>Recent posts to Sorting an array</title><link href="https://forge.codesys.com/forge/talk/Runtime/thread/6ae1b1ff98/" rel="alternate"/><link href="https://forge.codesys.com/forge/talk/Runtime/thread/6ae1b1ff98/feed.atom" rel="self"/><id>https://forge.codesys.com/forge/talk/Runtime/thread/6ae1b1ff98/</id><updated>2021-11-25T09:04:35.569000Z</updated><subtitle>Recent posts to Sorting an array</subtitle><entry><title>Sorting an array</title><link href="https://forge.codesys.com/forge/talk/Runtime/thread/6ae1b1ff98/?limit=25&amp;page=1#90b4/be6d" rel="alternate"/><published>2021-11-25T09:04:35.569000Z</published><updated>2021-11-25T09:04:35.569000Z</updated><author><name>gised-link</name><uri>https://forge.codesys.com/u/gised-link/</uri></author><id>https://forge.codesys.comc16ec28e95b3b4357fed98d5464017c0dbe11c8b</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;About the MEMCPY/cast in the Compare function: Yes of course a byte per byte comparison is stupid for REAL and also on other types. I was so excited that I forget to remove this commented line of code of my example... shame on me.&lt;/p&gt;
&lt;p&gt;We aren't far enough 😅... insertion sort is not that bad but merge sort or quick sort will be really more effective. I am looking to adapt the sort provided in the OSCAT lib to run using a pointer (PVOID) instead of a POINTER TO ARRAY&lt;span&gt;[1..32000]&lt;/span&gt; OF REAL. I have some issue with left and right boundaries and/or with the pivot start position. But I will find out soon I hope 😄&lt;/p&gt;
&lt;p&gt;My end goal is really to provide a Sort "function" (or class) that can Sort anything using a given compare function. So it will be easy to sort some FB_Biscuit by area size to know which one will get the more chocolate on it 😋&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>Sorting an array</title><link href="https://forge.codesys.com/forge/talk/Runtime/thread/6ae1b1ff98/?limit=25&amp;page=1#90b4/556d" rel="alternate"/><published>2021-11-25T09:04:32.256000Z</published><updated>2021-11-25T09:04:32.256000Z</updated><author><name>gised-link</name><uri>https://forge.codesys.com/u/gised-link/</uri></author><id>https://forge.codesys.comc841b1c44ad74f7ef95c89d5e4eef954bea42ba7</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;About the MEMCPY/cast in the Compare function: Yes of course a byte per byte comparison is stupid for REAL and also on other types. I was so excited that I forget to remove this commented line of code of my example... shame on me.&lt;/p&gt;
&lt;p&gt;We aren't far enough 😅... insertion sort is not that bad but merge sort or quick sort will be really more effective. I am looking to adapt the sort provided in the OSCAT lib to run using a pointer (PVOID) instead of a POINTER TO ARRAY&lt;span&gt;[1..32000]&lt;/span&gt; OF REAL. I have some issue with left and right boundaries and/or with the pivot start position. But I will find out soon I hope 😄&lt;/p&gt;
&lt;p&gt;My end goal is really to provide a Sort "function" (or class) that can Sort anything using a given compare function. So it will be easy to sort some FB_Biscuit by area size to know which one will get the more chocolate on it 😋&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>Sorting an array</title><link href="https://forge.codesys.com/forge/talk/Runtime/thread/6ae1b1ff98/?limit=250#90b4" rel="alternate"/><published>2021-11-25T08:03:37.977000Z</published><updated>2021-11-25T08:03:37.977000Z</updated><author><name>dFx</name><uri>https://forge.codesys.com/u/dfx/</uri></author><id>https://forge.codesys.com8b3a17011af92fa0f1131349889f118ad99a8aeb</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;I was worried we went a little too far on this topic, but you clearly went a step further.&lt;/p&gt;
&lt;p&gt;Just about the real comparaison, real values are store as IEEE format (see : &lt;a href="https://en.wikipedia.org/wiki/Single-precision_floating-point_format#IEEE_754_single-precision_binary_floating-point_format:binary32" rel="nofollow"&gt;https://en.wikipedia.org/wiki/Single-precision_floating-point_format#IEEE_754_single-precision_binary_floating-point_format:binary32&lt;/a&gt; ). That's a good exemple why you need to type cast and compare values knowing the datatype you are comparing.&lt;/p&gt;
&lt;p&gt;great input 👍&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>Sorting an array</title><link href="https://forge.codesys.com/forge/talk/Runtime/thread/6ae1b1ff98/?limit=25&amp;page=1#f6da" rel="alternate"/><published>2021-11-24T16:10:30.493000Z</published><updated>2021-11-24T16:10:30.493000Z</updated><author><name>gised-link</name><uri>https://forge.codesys.com/u/gised-link/</uri></author><id>https://forge.codesys.comee06ad0bdab2610dd65755132ff51e33681469b0</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Hi everyone,&lt;/p&gt;
&lt;p&gt;I have taken a look of your examples. In other languages we pass a comparison function as a parameter of the sorting function. This is not (or it is?) possible using ST language.&lt;/p&gt;
&lt;p&gt;A way to do it may be to create an ABSTRACT FUNCTION_BLOCK FB_Sort with a private Compare and final Sort method. Then in your code you have to create your own FB_Sort_blablabla (example: FB_Sort_REAL) which derivate from the abstract FB_Sort. Then you override the Compare method to fit your needs (like comparing REAL, LREAL, INT, FB_Biscuit, FB_Something, etc…).&lt;br/&gt;
You don't have to override the method Sort, it is the same for all your data types.&lt;br/&gt;
You don't need to implement anything in the body of your FB_Sort_blablabla.&lt;br/&gt;
To sort your array, simply call FB_Sort_blablabla.Sort(insert_all_parameters_as_described).&lt;br/&gt;
See code below:&lt;/p&gt;
&lt;p&gt;The Abstract function block FB_Sort with abstract method Compare and final method Sort:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="err"&gt;FUNCTION_BLOCK ABSTRACT FB_Sort&lt;/span&gt;
&lt;span class="err"&gt;(*&lt;/span&gt;
&lt;span class="err"&gt;* Purpose: Run an optimized version of insertion sort with specified order&lt;/span&gt;
&lt;span class="err"&gt;* Author: NothinRandom&lt;/span&gt;
&lt;span class="err"&gt;* v1.0  September 16, 2020&lt;/span&gt;
&lt;span class="err"&gt;* Note:&lt;/span&gt;
&lt;span class="err"&gt;*)&lt;/span&gt;
&lt;span class="err"&gt;VAR_INPUT&lt;/span&gt;
&lt;span class="err"&gt;END_VAR&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="err"&gt;// No code in the body, the sort algorithm is done using the Sort method&lt;/span&gt;
&lt;span class="err"&gt;// We could fill the body of this FB with the code of the Sort method&lt;/span&gt;
&lt;span class="err"&gt;// but then we cannot prevent someone to override it (or it will cause inatended behaviour)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Compare method:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c"&gt;(* Please override this method so it returns:&lt;/span&gt;
&lt;span class="c"&gt;* 0 : a == b&lt;/span&gt;
&lt;span class="c"&gt;*-1 : a &amp;lt; b&lt;/span&gt;
&lt;span class="c"&gt;* 1 : a &amp;gt; b&lt;/span&gt;
&lt;span class="c"&gt;* which a and b are the ADDRESS of the 2 elements you want to compare&lt;/span&gt;
&lt;span class="c"&gt;*)&lt;/span&gt;
&lt;span class="n"&gt;METHOD&lt;/span&gt; &lt;span class="n"&gt;ABSTRACT&lt;/span&gt; &lt;span class="n"&gt;Compare&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;DINT&lt;/span&gt;
&lt;span class="n"&gt;VAR_INPUT&lt;/span&gt;
    &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;PVOID&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;PVOID&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;END_VAR&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;hr/&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="err"&gt;// No code here since it is an abstract method !!!&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Sort method:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="err"&gt;METHOD FINAL Sort : BOOL&lt;/span&gt;
&lt;span class="err"&gt;VAR_INPUT&lt;/span&gt;
&lt;span class="err"&gt;    pbBuffer    : POINTER TO BYTE; // pointer to buffer&lt;/span&gt;
&lt;span class="err"&gt;    diElements  : DINT;            // array length&lt;/span&gt;
&lt;span class="err"&gt;    uiDataSize  : UINT;            // use it like this : uiDataType := SIZEOF(MyDataType) &lt;/span&gt;
&lt;span class="err"&gt;                                   // where MyDataType is the type your currently want to compare&lt;/span&gt;
&lt;span class="err"&gt;    bDescending : BOOL := FALSE;   // default ascending&lt;/span&gt;
&lt;span class="err"&gt;END_VAR&lt;/span&gt;
&lt;span class="err"&gt;VAR&lt;/span&gt;
&lt;span class="err"&gt;    _diIndex            : DINT;                 // loop index&lt;/span&gt;
&lt;span class="err"&gt;    _diMinIndex         : DINT;                 // loop lowest index tested&lt;/span&gt;
&lt;span class="err"&gt;    _diMaxIndex         : DINT;                 // loop highest index tested&lt;/span&gt;
&lt;span class="err"&gt;    _diCurrentIndex     : DINT;                 // loop current tested element index&lt;/span&gt;
&lt;span class="err"&gt;    _abTemp             : ARRAY [1..8] OF BYTE; // store temp value&lt;/span&gt;
&lt;span class="err"&gt;    _pbElement1         : PVOID;      // pointer operator, current element&lt;/span&gt;
&lt;span class="err"&gt;    _pbElement2         : PVOID;      // pointer operator, insert element&lt;/span&gt;
&lt;span class="err"&gt;    _pCurrent : PVOID;&lt;/span&gt;
&lt;span class="err"&gt;END_VAR&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;hr/&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nt"&gt;IF&lt;/span&gt; &lt;span class="nt"&gt;uiDataSize&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;8&lt;/span&gt; &lt;span class="nt"&gt;THEN&lt;/span&gt;
    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nt"&gt;Not&lt;/span&gt; &lt;span class="nt"&gt;enough&lt;/span&gt; &lt;span class="nt"&gt;space&lt;/span&gt; &lt;span class="nt"&gt;to&lt;/span&gt; &lt;span class="nt"&gt;store&lt;/span&gt; &lt;span class="nt"&gt;the&lt;/span&gt; &lt;span class="nt"&gt;data&lt;/span&gt;
    &lt;span class="nt"&gt;Sort&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nt"&gt;FALSE&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="nt"&gt;RETURN&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;END_IF&lt;/span&gt;

&lt;span class="nt"&gt;FOR&lt;/span&gt; &lt;span class="nt"&gt;_diIndex&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nt"&gt;1&lt;/span&gt; &lt;span class="nt"&gt;TO&lt;/span&gt; &lt;span class="nt"&gt;diElements&lt;/span&gt; &lt;span class="nt"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;1&lt;/span&gt; &lt;span class="nt"&gt;DO&lt;/span&gt;
    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nt"&gt;highest&lt;/span&gt; &lt;span class="nt"&gt;index&lt;/span&gt; &lt;span class="nt"&gt;tested&lt;/span&gt;
    &lt;span class="nt"&gt;_diMaxIndex&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nt"&gt;_diIndex&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nt"&gt;lowest&lt;/span&gt; &lt;span class="nt"&gt;index&lt;/span&gt; &lt;span class="nt"&gt;tested&lt;/span&gt;
    &lt;span class="nt"&gt;_diMinIndex&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nt"&gt;-1&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nt"&gt;element&lt;/span&gt; &lt;span class="nt"&gt;we&lt;/span&gt; &lt;span class="nt"&gt;need&lt;/span&gt; &lt;span class="nt"&gt;to&lt;/span&gt; &lt;span class="nt"&gt;insert&lt;/span&gt;
    &lt;span class="nt"&gt;_pbElement2&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nt"&gt;pbBuffer&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;TO_UDINT&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;uiDataSize&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nt"&gt;_diIndex&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="nt"&gt;REPEAT&lt;/span&gt;
        &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nt"&gt;current&lt;/span&gt; &lt;span class="nt"&gt;test&lt;/span&gt; &lt;span class="nt"&gt;index&lt;/span&gt;
        &lt;span class="nt"&gt;_diCurrentIndex&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nt"&gt;_diMinIndex&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;_diMaxIndex-_diMinIndex&lt;/span&gt;&lt;span class="o"&gt;)/&lt;/span&gt;&lt;span class="nt"&gt;2&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nt"&gt;get&lt;/span&gt; &lt;span class="nt"&gt;element&lt;/span&gt; &lt;span class="nt"&gt;at&lt;/span&gt; &lt;span class="nt"&gt;current&lt;/span&gt; &lt;span class="nt"&gt;test&lt;/span&gt; &lt;span class="nt"&gt;index&lt;/span&gt;
        &lt;span class="nt"&gt;_pbElement1&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nt"&gt;pbBuffer&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;TO_UDINT&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;uiDataSize&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nt"&gt;_diCurrentIndex&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="nt"&gt;IF&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;NOT&lt;/span&gt; &lt;span class="nt"&gt;bDescending&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nt"&gt;THEN&lt;/span&gt;
            &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nt"&gt;IF&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;_liElement1&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;_liElement2&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nt"&gt;THEN&lt;/span&gt;
            &lt;span class="nt"&gt;IF&lt;/span&gt; &lt;span class="nt"&gt;THIS&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Compare&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nt"&gt;_pbElement1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;b&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nt"&gt;_pbElement2&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;0&lt;/span&gt; &lt;span class="nt"&gt;THEN&lt;/span&gt;
               &lt;span class="nt"&gt;_diMaxIndex&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nt"&gt;_diCurrentIndex&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
            &lt;span class="nt"&gt;ELSE&lt;/span&gt;
                &lt;span class="nt"&gt;_diMinIndex&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nt"&gt;_diCurrentIndex&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
            &lt;span class="nt"&gt;END_IF&lt;/span&gt;
        &lt;span class="nt"&gt;ELSE&lt;/span&gt;
            &lt;span class="nt"&gt;IF&lt;/span&gt; &lt;span class="nt"&gt;THIS&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Compare&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nt"&gt;_pbElement1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;b&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nt"&gt;_pbElement2&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;0&lt;/span&gt; &lt;span class="nt"&gt;THEN&lt;/span&gt;
               &lt;span class="nt"&gt;_diMinIndex&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nt"&gt;_diCurrentIndex&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
            &lt;span class="nt"&gt;ELSE&lt;/span&gt;
                &lt;span class="nt"&gt;_diMaxIndex&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nt"&gt;_diCurrentIndex&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
            &lt;span class="nt"&gt;END_IF&lt;/span&gt;
        &lt;span class="nt"&gt;END_IF&lt;/span&gt;

    &lt;span class="nt"&gt;UNTIL&lt;/span&gt;
        &lt;span class="nt"&gt;_diMaxIndex&lt;/span&gt; &lt;span class="nt"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;_diMinIndex&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nt"&gt;2&lt;/span&gt;
    &lt;span class="nt"&gt;END_REPEAT&lt;/span&gt;

    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nt"&gt;Save&lt;/span&gt; &lt;span class="nt"&gt;value&lt;/span&gt; &lt;span class="nt"&gt;to&lt;/span&gt; &lt;span class="nt"&gt;insert&lt;/span&gt;
    &lt;span class="nt"&gt;MEMCPY&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;destAddr&lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="nt"&gt;ADR&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;_abTemp&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="nt"&gt;srcAddr&lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="nt"&gt;_pbElement2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;n&lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="nt"&gt;uiDataSize&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nt"&gt;Move&lt;/span&gt; &lt;span class="nt"&gt;block&lt;/span&gt;
    &lt;span class="nt"&gt;MEMMOVE&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;destAddr&lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="nt"&gt;pbBuffer&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nt"&gt;uiDataSize&lt;/span&gt;&lt;span class="o"&gt;*(&lt;/span&gt;&lt;span class="nt"&gt;TO_UDINT&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;_diMaxIndex&lt;/span&gt;&lt;span class="o"&gt;)+&lt;/span&gt;&lt;span class="nt"&gt;1&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
            &lt;span class="nt"&gt;srcAddr&lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="nt"&gt;pbBuffer&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nt"&gt;TO_UDINT&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;uiDataSize&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nt"&gt;_diMaxIndex&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
            &lt;span class="nt"&gt;n&lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="nt"&gt;uiDataSize&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nt"&gt;TO_UDINT&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;_diIndex-_diMaxIndex&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nt"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;key&lt;/span&gt;
    &lt;span class="nt"&gt;MEMCPY&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;destAddr&lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="nt"&gt;pbBuffer&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nt"&gt;uiDataSize&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nt"&gt;TO_UDINT&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;_diMaxIndex&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
           &lt;span class="nt"&gt;srcAddr&lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="nt"&gt;ADR&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;_abTemp&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
           &lt;span class="nt"&gt;n&lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="nt"&gt;uiDataSize&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="nt"&gt;END_FOR&lt;/span&gt;

&lt;span class="nt"&gt;Sort&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nt"&gt;TRUE&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Ok ... that's for the base of all your future sort function block... Let see an example that can be used to sort REAL type:&lt;/p&gt;
&lt;p&gt;First create a new FB which EXTENDS from FB_Sort like this (the FINAL keyword is not necessary):&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="err"&gt;FUNCTION_BLOCK FINAL FB_Sort_Real EXTENDS FB_Sort&lt;/span&gt;
&lt;span class="err"&gt;VAR_INPUT&lt;/span&gt;
&lt;span class="err"&gt;END_VAR&lt;/span&gt;
&lt;span class="err"&gt;VAR_OUTPUT&lt;/span&gt;
&lt;span class="err"&gt;END_VAR&lt;/span&gt;
&lt;span class="err"&gt;VAR&lt;/span&gt;
&lt;span class="err"&gt;END_VAR&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="err"&gt;// Leave the body empty&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Then, simply override the Compare method:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c"&gt;(* Please override this method so it returns:&lt;/span&gt;
&lt;span class="c"&gt;* 0 : a == b&lt;/span&gt;
&lt;span class="c"&gt;*-1 : a &amp;lt; b&lt;/span&gt;
&lt;span class="c"&gt;* 1 : a &amp;gt; b&lt;/span&gt;
&lt;span class="c"&gt;* which a and b are the ADDRESS of the 2 elements you want to compare&lt;/span&gt;
&lt;span class="c"&gt;*)&lt;/span&gt;
&lt;span class="n"&gt;METHOD&lt;/span&gt;  &lt;span class="n"&gt;Compare&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;DINT&lt;/span&gt;
&lt;span class="n"&gt;VAR_INPUT&lt;/span&gt;
    &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;PVOID&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;PVOID&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;END_VAR&lt;/span&gt;
&lt;span class="n"&gt;VAR&lt;/span&gt;
    &lt;span class="o"&gt;_&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;REAL&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; 
    &lt;span class="o"&gt;_&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;REAL&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;END_VAR&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;Here&lt;/span&gt; &lt;span class="n"&gt;I&lt;/span&gt; &lt;span class="n"&gt;tried&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;byte&lt;/span&gt; &lt;span class="n"&gt;per&lt;/span&gt; &lt;span class="n"&gt;byte&lt;/span&gt; &lt;span class="n"&gt;comparison&lt;/span&gt;
&lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;Unfortunately&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="k"&gt;not&lt;/span&gt; &lt;span class="n"&gt;working&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;REAL&lt;/span&gt; &lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="n"&gt;maybe&lt;/span&gt; &lt;span class="n"&gt;little&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;big&lt;/span&gt; &lt;span class="n"&gt;endian&lt;/span&gt; &lt;span class="n"&gt;issue&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;
&lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;This&lt;/span&gt; &lt;span class="n"&gt;could&lt;/span&gt; &lt;span class="n"&gt;also&lt;/span&gt; &lt;span class="k"&gt;not&lt;/span&gt; &lt;span class="k"&gt;work&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;integer&lt;/span&gt; &lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;INT&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;UINT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;DINT&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;UDINT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...)&lt;/span&gt;
&lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;Compare&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MEMCMP&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SIZEOF&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;REAL&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;The&lt;/span&gt; &lt;span class="ss"&gt;"cast"&lt;/span&gt; &lt;span class="k"&gt;method&lt;/span&gt; &lt;span class="n"&gt;will&lt;/span&gt; &lt;span class="n"&gt;worked&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="k"&gt;any&lt;/span&gt; &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="k"&gt;and&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;any&lt;/span&gt; &lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;like&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;FB_Something&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;MEMCPY&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;destAddr&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ADR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_a&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;srcAddr&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SIZEOF&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;REAL&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;does&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;_a&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;MEMCPY&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;destAddr&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ADR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_b&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;srcAddr&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SIZEOF&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;REAL&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;does&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;_b&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;IF&lt;/span&gt; &lt;span class="n"&gt;_a&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;_b&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
    &lt;span class="n"&gt;Compare&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;ELSIF&lt;/span&gt; &lt;span class="n"&gt;_a&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_b&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
    &lt;span class="n"&gt;Compare&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;ELSE&lt;/span&gt;
    &lt;span class="n"&gt;Compare&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;END_IF&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;And I use the code like it somewhere inside my project:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;VAR&lt;/span&gt;
    &lt;span class="n"&gt;array_toto&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;ARRAY&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;..&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;OF&lt;/span&gt; &lt;span class="nb"&gt;REAL&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; 
        &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

    &lt;span class="n"&gt;sort_real&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;FB_Sort_Real&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;END_VAR&lt;/span&gt;
&lt;span class="c1"&gt;---&lt;/span&gt;
&lt;span class="n"&gt;sort_real&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pbBuffer&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ADR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;array_toto&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; 
               &lt;span class="n"&gt;diElements&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
               &lt;span class="n"&gt;uiDataSize&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SIZEOF&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;REAL&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
               &lt;span class="n"&gt;bDescending&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;FALSE&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;</summary></entry><entry><title>Sorting an array</title><link href="https://forge.codesys.com/forge/talk/Runtime/thread/6ae1b1ff98/?limit=25&amp;page=1#e9a1/db25/a401" rel="alternate"/><published>2020-09-26T03:53:59.920000Z</published><updated>2020-09-26T03:53:59.920000Z</updated><author><name>Ingo</name><uri>https://forge.codesys.com/u/ingo/</uri></author><id>https://forge.codesys.comcb036984cd4a29bc9924010b32ce5279d8843b0a</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;You're right. I forgot 😉&lt;br/&gt;
A workaround for this can be:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;VAR_INPUT&lt;/span&gt;
    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;reference&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="k"&gt;first&lt;/span&gt; &lt;span class="n"&gt;element&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="n"&gt;sort&lt;/span&gt;
    &lt;span class="nb"&gt;array&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;ANY&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nb"&gt;number&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="n"&gt;elements&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="nb"&gt;array&lt;/span&gt;
    &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;DINT&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;END_VAR&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;</summary></entry><entry><title>Sorting an array</title><link href="https://forge.codesys.com/forge/talk/Runtime/thread/6ae1b1ff98/?limit=25#e9a1/db25" rel="alternate"/><published>2020-09-26T01:01:30.999000Z</published><updated>2020-09-26T01:01:30.999000Z</updated><author><name>nothinrandom</name><uri>https://forge.codesys.com/u/nothinrandom/</uri></author><id>https://forge.codesys.com96f9be32abe3ff92b488c0214213e0870ef1039c</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;@Ingo, I tried using datatype ANY at first.  However, we're not allowed to have something like &lt;code&gt;ARRAY[1..10] OF ANY_NUM&lt;/code&gt; or &lt;code&gt;POINTER TO ARRAY[1..10] OF ANY_NUM&lt;/code&gt;, so it can only be &lt;code&gt;ANY_NUM&lt;/code&gt; inside VAR_INPUT.  I am not sure how we could provide sorting in this scenario.  Is it possible to move this thread into Engineering?&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>Sorting an array</title><link href="https://forge.codesys.com/forge/talk/Runtime/thread/6ae1b1ff98/?limit=25#e9a1" rel="alternate"/><published>2020-09-25T23:17:47.455000Z</published><updated>2020-09-25T23:17:47.455000Z</updated><author><name>Ingo</name><uri>https://forge.codesys.com/u/ingo/</uri></author><id>https://forge.codesys.comfcc582d1395f4da536296ce7ba468d8b1362aa5f</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Hi guys!&lt;br/&gt;
I guess it is due to the high cost of the&lt;br/&gt;
CASE within the loops.&lt;/p&gt;
&lt;p&gt;Another interfacing idea was, to use the ANY datatype:&lt;br/&gt;
&lt;a href="https://forge.codesys.com/tol/iec-snippets/snippets/8/"&gt;https://forge.codesys.com/tol/iec-snippets/snippets/8/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Then, to optimize the swapping, I would avoid the CASE, and just copy the elements by size (which is defined already by ANY).&lt;/p&gt;
&lt;p&gt;What do you think?&lt;/p&gt;
&lt;p&gt;Cheers,&lt;br/&gt;
Ingo &lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>Sorting an array</title><link href="https://forge.codesys.com/forge/talk/Runtime/thread/6ae1b1ff98/?limit=100#6a51" rel="alternate"/><published>2020-09-25T17:23:26.177000Z</published><updated>2020-09-25T17:23:26.177000Z</updated><author><name>dFx</name><uri>https://forge.codesys.com/u/dfx/</uri></author><id>https://forge.codesys.comdeb553d67f93e2665209c5eb7b191239c173f3d1</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Had a look at OSCAT basic, which is implementing quicksort in ARRAYSORT (REAL datatype only).&lt;br/&gt;
it's a faster on simulation, sorting 10000 random items is averaging 1ms while my code produces 7ms.&lt;br/&gt;
Maybe that's due too the good use of cpu caching by C&amp;amp;D. That would be great to have so measurement on a real PLC.&lt;br/&gt;
Or maybe that's worthless reinventing what's already written down 😂&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>Sorting an array</title><link href="https://forge.codesys.com/forge/talk/Runtime/thread/6ae1b1ff98/?limit=25#31a5/f035/66da/5ba5/1553/b75d/ce46" rel="alternate"/><published>2020-09-25T17:03:26.766000Z</published><updated>2020-09-25T17:03:26.766000Z</updated><author><name>nothinrandom</name><uri>https://forge.codesys.com/u/nothinrandom/</uri></author><id>https://forge.codesys.com1b21dcd784e61d57e91f77cf494c31dc90862a72</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;&lt;a class="user-mention" href="/u/dfx/"&gt;@dfx&lt;/a&gt;, good stuff. Looks that min index needed to be a DINT so that you can shift minimum from 0 to -1.&lt;/p&gt;
&lt;p&gt;I've made updates on my end and incorporated your work:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nv"&gt;FUNCTION&lt;/span&gt; &lt;span class="nv"&gt;numInsertSort&lt;/span&gt; : &lt;span class="nv"&gt;BOOL&lt;/span&gt;
&lt;span class="nv"&gt;VAR_INPUT&lt;/span&gt;
    &lt;span class="nv"&gt;pbBuffer&lt;/span&gt;            : &lt;span class="nv"&gt;POINTER&lt;/span&gt; &lt;span class="nv"&gt;TO&lt;/span&gt; &lt;span class="nv"&gt;BYTE&lt;/span&gt;&lt;span class="c1"&gt;;      // pointer to buffer&lt;/span&gt;
    &lt;span class="nv"&gt;diElements&lt;/span&gt;          : &lt;span class="nv"&gt;DINT&lt;/span&gt;&lt;span class="c1"&gt;;                 // array length&lt;/span&gt;
    &lt;span class="nv"&gt;uiDataType&lt;/span&gt;          : &lt;span class="nv"&gt;UINT&lt;/span&gt;&lt;span class="c1"&gt;;                 // data type: SINT(1), USINT/BYTE(2), INT(3), UINT/WORD(4), DINT(5), UDINT/DWORD(6), LINT(7), ULINT/LWORD(8), REAL(9), LREAL(10)&lt;/span&gt;
    &lt;span class="nv"&gt;bDescending&lt;/span&gt;         : &lt;span class="nv"&gt;BOOL&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;FALSE&lt;/span&gt;&lt;span class="c1"&gt;;        // default ascending&lt;/span&gt;
&lt;span class="nv"&gt;END_VAR&lt;/span&gt;
&lt;span class="nv"&gt;VAR&lt;/span&gt;
    &lt;span class="nv"&gt;_uiDataSize&lt;/span&gt;         : &lt;span class="nv"&gt;UINT&lt;/span&gt;&lt;span class="c1"&gt;;                 // element size&lt;/span&gt;
    &lt;span class="nv"&gt;_diIndex&lt;/span&gt;            : &lt;span class="nv"&gt;DINT&lt;/span&gt;&lt;span class="c1"&gt;;                 // loop index&lt;/span&gt;
    &lt;span class="nv"&gt;_diMinIndex&lt;/span&gt;         : &lt;span class="nv"&gt;DINT&lt;/span&gt;&lt;span class="c1"&gt;;                 // loop lowest index tested&lt;/span&gt;
    &lt;span class="nv"&gt;_diMaxIndex&lt;/span&gt;         : &lt;span class="nv"&gt;DINT&lt;/span&gt;&lt;span class="c1"&gt;;                 // loop highest index tested&lt;/span&gt;
    &lt;span class="nv"&gt;_diCurrentIndex&lt;/span&gt;     : &lt;span class="nv"&gt;DINT&lt;/span&gt;&lt;span class="c1"&gt;;                 // loop current tested element index&lt;/span&gt;
    &lt;span class="nv"&gt;_abTemp&lt;/span&gt;             : &lt;span class="nv"&gt;ARRAY&lt;/span&gt; [&lt;span class="mi"&gt;1&lt;/span&gt;..&lt;span class="mi"&gt;8&lt;/span&gt;] &lt;span class="nv"&gt;OF&lt;/span&gt; &lt;span class="nv"&gt;BYTE&lt;/span&gt;&lt;span class="c1"&gt;; // store temp value&lt;/span&gt;
    &lt;span class="nv"&gt;_pbElement1&lt;/span&gt;         : &lt;span class="nv"&gt;POINTER&lt;/span&gt; &lt;span class="nv"&gt;TO&lt;/span&gt; &lt;span class="nv"&gt;BYTE&lt;/span&gt;&lt;span class="c1"&gt;;      // pointer operator, current element&lt;/span&gt;
    &lt;span class="nv"&gt;_pbElement2&lt;/span&gt;         : &lt;span class="nv"&gt;POINTER&lt;/span&gt; &lt;span class="nv"&gt;TO&lt;/span&gt; &lt;span class="nv"&gt;BYTE&lt;/span&gt;&lt;span class="c1"&gt;;      // pointer operator, insert element&lt;/span&gt;
    &lt;span class="nv"&gt;_liElement1&lt;/span&gt;         : &lt;span class="nv"&gt;LINT&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;_liElement2&lt;/span&gt;         : &lt;span class="nv"&gt;LINT&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;_uliElement1&lt;/span&gt;        : &lt;span class="nv"&gt;ULINT&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;_uliElement2&lt;/span&gt;        : &lt;span class="nv"&gt;ULINT&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;_rElement1&lt;/span&gt;          : &lt;span class="nv"&gt;REAL&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;_rElement2&lt;/span&gt;          : &lt;span class="nv"&gt;REAL&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;_lrElement1&lt;/span&gt;         : &lt;span class="nv"&gt;LREAL&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;_lrElement2&lt;/span&gt;         : &lt;span class="nv"&gt;LREAL&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;END_VAR&lt;/span&gt;

&lt;span class="o"&gt;================================================================================================================&lt;/span&gt;

&lt;span class="nv"&gt;CASE&lt;/span&gt; &lt;span class="nv"&gt;uiDataType&lt;/span&gt; &lt;span class="nv"&gt;OF&lt;/span&gt;
    &lt;span class="mi"&gt;1&lt;/span&gt;,&lt;span class="mi"&gt;2&lt;/span&gt;: &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;SINT&lt;/span&gt;, &lt;span class="nv"&gt;USINT&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;BYTE&lt;/span&gt;
        &lt;span class="nv"&gt;_uiDataSize&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
    &lt;span class="mi"&gt;3&lt;/span&gt;,&lt;span class="mi"&gt;4&lt;/span&gt;: &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;INT&lt;/span&gt;, &lt;span class="nv"&gt;UINT&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;WORD&lt;/span&gt;
        &lt;span class="nv"&gt;_uiDataSize&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
    &lt;span class="mi"&gt;5&lt;/span&gt;,&lt;span class="mi"&gt;6&lt;/span&gt;,&lt;span class="mi"&gt;9&lt;/span&gt;: &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;DINT&lt;/span&gt;, &lt;span class="nv"&gt;UDINT&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;DWORD&lt;/span&gt;, &lt;span class="nv"&gt;REAL&lt;/span&gt;
        &lt;span class="nv"&gt;_uiDataSize&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
    &lt;span class="mi"&gt;7&lt;/span&gt;,&lt;span class="mi"&gt;8&lt;/span&gt;,&lt;span class="mi"&gt;10&lt;/span&gt;: &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;LINT&lt;/span&gt;, &lt;span class="nv"&gt;ULINT&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;LWORD&lt;/span&gt;, &lt;span class="nv"&gt;LREAL&lt;/span&gt;
        &lt;span class="nv"&gt;_uiDataSize&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;ELSE&lt;/span&gt;
    &lt;span class="k"&gt;RETURN&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;END_CASE&lt;/span&gt;

&lt;span class="k"&gt;FOR&lt;/span&gt; &lt;span class="nv"&gt;_diIndex&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="nv"&gt;TO&lt;/span&gt; &lt;span class="nv"&gt;diElements&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;DO&lt;/span&gt;
    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;highest&lt;/span&gt; &lt;span class="nv"&gt;index&lt;/span&gt; &lt;span class="nv"&gt;tested&lt;/span&gt;
    &lt;span class="nv"&gt;_diMaxIndex&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;_diIndex&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;lowest&lt;/span&gt; &lt;span class="nv"&gt;index&lt;/span&gt; &lt;span class="nv"&gt;tested&lt;/span&gt;
    &lt;span class="nv"&gt;_diMinIndex&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;element&lt;/span&gt; &lt;span class="nv"&gt;we&lt;/span&gt; &lt;span class="nv"&gt;need&lt;/span&gt; &lt;span class="nv"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;insert&lt;/span&gt;
    &lt;span class="nv"&gt;_pbElement2&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;pbBuffer&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nv"&gt;TO_UDINT&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;_uiDataSize&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nv"&gt;_diIndex&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;REPEAT&lt;/span&gt;
        &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;current&lt;/span&gt; &lt;span class="nv"&gt;test&lt;/span&gt; &lt;span class="nv"&gt;index&lt;/span&gt;
        &lt;span class="nv"&gt;_diCurrentIndex&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;_diMinIndex&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;_diMaxIndex&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;_diMinIndex&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;get&lt;/span&gt; &lt;span class="nv"&gt;element&lt;/span&gt; &lt;span class="nv"&gt;at&lt;/span&gt; &lt;span class="nv"&gt;current&lt;/span&gt; &lt;span class="nv"&gt;test&lt;/span&gt; &lt;span class="nv"&gt;index&lt;/span&gt;
        &lt;span class="nv"&gt;_pbElement1&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;pbBuffer&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nv"&gt;TO_UDINT&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;_uiDataSize&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nv"&gt;_diCurrentIndex&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
        &lt;span class="nv"&gt;CASE&lt;/span&gt; &lt;span class="nv"&gt;uiDataType&lt;/span&gt; &lt;span class="nv"&gt;OF&lt;/span&gt;
            &lt;span class="mi"&gt;1&lt;/span&gt;,&lt;span class="mi"&gt;3&lt;/span&gt;,&lt;span class="mi"&gt;5&lt;/span&gt;,&lt;span class="mi"&gt;7&lt;/span&gt;: &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;SINT&lt;/span&gt;, &lt;span class="nv"&gt;INT&lt;/span&gt;, &lt;span class="nv"&gt;DINT&lt;/span&gt;, &lt;span class="nv"&gt;LINT&lt;/span&gt;
                &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;test&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nv"&gt;ordering&lt;/span&gt;
                &lt;span class="nv"&gt;SysMemCpy&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;pDest&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;ADR&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;_liElement1&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;, &lt;span class="nv"&gt;pSrc&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;_pbElement1&lt;/span&gt;, &lt;span class="nv"&gt;udiCount&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;_uiDataSize&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
                &lt;span class="nv"&gt;SysMemCpy&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;pDest&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;ADR&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;_liElement2&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;, &lt;span class="nv"&gt;pSrc&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;_pbElement2&lt;/span&gt;, &lt;span class="nv"&gt;udiCount&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;_uiDataSize&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
                &lt;span class="k"&gt;IF&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;NOT&lt;/span&gt; &lt;span class="nv"&gt;bDescending&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
                    &lt;span class="k"&gt;IF&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;_liElement1&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;_liElement2&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
                       &lt;span class="nv"&gt;_diMaxIndex&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;_diCurrentIndex&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
                    &lt;span class="k"&gt;ELSE&lt;/span&gt;
                        &lt;span class="nv"&gt;_diMinIndex&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;_diCurrentIndex&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
                    &lt;span class="nv"&gt;END_IF&lt;/span&gt;
                &lt;span class="k"&gt;ELSE&lt;/span&gt;
                    &lt;span class="k"&gt;IF&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;_liElement1&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;_liElement2&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
                       &lt;span class="nv"&gt;_diMinIndex&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;_diCurrentIndex&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
                    &lt;span class="k"&gt;ELSE&lt;/span&gt;
                        &lt;span class="nv"&gt;_diMaxIndex&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;_diCurrentIndex&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
                    &lt;span class="nv"&gt;END_IF&lt;/span&gt;
                &lt;span class="nv"&gt;END_IF&lt;/span&gt;
            &lt;span class="mi"&gt;2&lt;/span&gt;,&lt;span class="mi"&gt;4&lt;/span&gt;,&lt;span class="mi"&gt;6&lt;/span&gt;,&lt;span class="mi"&gt;8&lt;/span&gt;: &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;USINT&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;BYTE&lt;/span&gt;, &lt;span class="nv"&gt;UINT&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;WORD&lt;/span&gt;, &lt;span class="nv"&gt;UDINT&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;DWORD&lt;/span&gt;, &lt;span class="nv"&gt;ULINT&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;LWORD&lt;/span&gt;
                &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;test&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nv"&gt;ordering&lt;/span&gt;
                &lt;span class="nv"&gt;SysMemCpy&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;pDest&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;ADR&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;_uliElement1&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;, &lt;span class="nv"&gt;pSrc&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;_pbElement1&lt;/span&gt;, &lt;span class="nv"&gt;udiCount&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;_uiDataSize&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
                &lt;span class="nv"&gt;SysMemCpy&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;pDest&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;ADR&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;_uliElement2&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;, &lt;span class="nv"&gt;pSrc&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;_pbElement2&lt;/span&gt;, &lt;span class="nv"&gt;udiCount&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;_uiDataSize&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
                &lt;span class="k"&gt;IF&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;NOT&lt;/span&gt; &lt;span class="nv"&gt;bDescending&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
                    &lt;span class="k"&gt;IF&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;_uliElement1&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;_uliElement2&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
                       &lt;span class="nv"&gt;_diMaxIndex&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;_diCurrentIndex&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
                    &lt;span class="k"&gt;ELSE&lt;/span&gt;
                        &lt;span class="nv"&gt;_diMinIndex&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;_diCurrentIndex&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
                    &lt;span class="nv"&gt;END_IF&lt;/span&gt;
                &lt;span class="k"&gt;ELSE&lt;/span&gt;
                    &lt;span class="k"&gt;IF&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;_uliElement1&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;_uliElement2&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
                       &lt;span class="nv"&gt;_diMinIndex&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;_diCurrentIndex&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
                    &lt;span class="k"&gt;ELSE&lt;/span&gt;
                        &lt;span class="nv"&gt;_diMaxIndex&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;_diCurrentIndex&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
                    &lt;span class="nv"&gt;END_IF&lt;/span&gt;
                &lt;span class="nv"&gt;END_IF&lt;/span&gt;
            &lt;span class="mi"&gt;9&lt;/span&gt;: &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;REAL&lt;/span&gt;
                &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;test&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nv"&gt;ordering&lt;/span&gt;
                &lt;span class="nv"&gt;SysMemCpy&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;pDest&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;ADR&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;_rElement1&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;, &lt;span class="nv"&gt;pSrc&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;_pbElement1&lt;/span&gt;, &lt;span class="nv"&gt;udiCount&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;_uiDataSize&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
                &lt;span class="nv"&gt;SysMemCpy&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;pDest&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;ADR&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;_rElement2&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;, &lt;span class="nv"&gt;pSrc&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;_pbElement2&lt;/span&gt;, &lt;span class="nv"&gt;udiCount&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;_uiDataSize&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;                &lt;/span&gt;
                &lt;span class="k"&gt;IF&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;NOT&lt;/span&gt; &lt;span class="nv"&gt;bDescending&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
                    &lt;span class="k"&gt;IF&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;_rElement1&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;_rElement2&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
                        &lt;span class="nv"&gt;_diMaxIndex&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;_diCurrentIndex&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
                    &lt;span class="k"&gt;ELSE&lt;/span&gt;
                        &lt;span class="nv"&gt;_diMinIndex&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;_diCurrentIndex&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
                    &lt;span class="nv"&gt;END_IF&lt;/span&gt;
                &lt;span class="k"&gt;ELSE&lt;/span&gt;
                    &lt;span class="k"&gt;IF&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;_rElement1&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;_rElement2&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
                        &lt;span class="nv"&gt;_diMinIndex&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;_diCurrentIndex&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
                    &lt;span class="k"&gt;ELSE&lt;/span&gt;
                        &lt;span class="nv"&gt;_diMaxIndex&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;_diCurrentIndex&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
                    &lt;span class="nv"&gt;END_IF&lt;/span&gt;
                &lt;span class="nv"&gt;END_IF&lt;/span&gt;
            &lt;span class="mi"&gt;10&lt;/span&gt;: &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;LREAL&lt;/span&gt;
                &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;test&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nv"&gt;ordering&lt;/span&gt;
                &lt;span class="nv"&gt;SysMemCpy&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;pDest&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;ADR&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;_lrElement1&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;, &lt;span class="nv"&gt;pSrc&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;_pbElement1&lt;/span&gt;, &lt;span class="nv"&gt;udiCount&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;_uiDataSize&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
                &lt;span class="nv"&gt;SysMemCpy&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;pDest&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;ADR&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;_lrElement2&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;, &lt;span class="nv"&gt;pSrc&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;_pbElement2&lt;/span&gt;, &lt;span class="nv"&gt;udiCount&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;_uiDataSize&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
                &lt;span class="k"&gt;IF&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;NOT&lt;/span&gt; &lt;span class="nv"&gt;bDescending&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
                    &lt;span class="k"&gt;IF&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;_lrElement1&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;_lrElement2&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
                        &lt;span class="nv"&gt;_diMaxIndex&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;_diCurrentIndex&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
                    &lt;span class="k"&gt;ELSE&lt;/span&gt;
                        &lt;span class="nv"&gt;_diMinIndex&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;_diCurrentIndex&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
                    &lt;span class="nv"&gt;END_IF&lt;/span&gt;
                &lt;span class="k"&gt;ELSE&lt;/span&gt;
                    &lt;span class="k"&gt;IF&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;_lrElement1&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;_lrElement2&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
                        &lt;span class="nv"&gt;_diMinIndex&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;_diCurrentIndex&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
                    &lt;span class="k"&gt;ELSE&lt;/span&gt;
                        &lt;span class="nv"&gt;_diMaxIndex&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;_diCurrentIndex&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
                    &lt;span class="nv"&gt;END_IF&lt;/span&gt;
                &lt;span class="nv"&gt;END_IF&lt;/span&gt;
        &lt;span class="nv"&gt;END_CASE&lt;/span&gt;
    &lt;span class="k"&gt;UNTIL&lt;/span&gt;
        &lt;span class="nv"&gt;_diMaxIndex&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nv"&gt;_diMinIndex&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
    &lt;span class="nv"&gt;END_REPEAT&lt;/span&gt;
    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;Save&lt;/span&gt; &lt;span class="nv"&gt;value&lt;/span&gt; &lt;span class="nv"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;insert&lt;/span&gt;
    &lt;span class="nv"&gt;SysMemCpy&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;pDest&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;ADR&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;_abTemp&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;, &lt;span class="nv"&gt;pSrc&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;_pbElement2&lt;/span&gt;, &lt;span class="nv"&gt;udiCount&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;_uiDataSize&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;Move&lt;/span&gt; &lt;span class="nv"&gt;block&lt;/span&gt;
    &lt;span class="nv"&gt;SysMemMove&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;pDest&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;pbBuffer&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nv"&gt;_uiDataSize&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;TO_UDINT&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;_diMaxIndex&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;, &lt;span class="nv"&gt;pSrc&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;pbBuffer&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nv"&gt;TO_UDINT&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;_uiDataSize&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nv"&gt;_diMaxIndex&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;, &lt;span class="nv"&gt;udiCount&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;_uiDataSize&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nv"&gt;TO_UDINT&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;_diIndex&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;_diMaxIndex&lt;/span&gt;&lt;span class="ss"&gt;))&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;key&lt;/span&gt;
    &lt;span class="nv"&gt;SysMemCpy&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;pDest&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;pbBuffer&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nv"&gt;_uiDataSize&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nv"&gt;TO_UDINT&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;_diMaxIndex&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;, &lt;span class="nv"&gt;pSrc&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;ADR&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;_abTemp&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;, &lt;span class="nv"&gt;udiCount&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;_uiDataSize&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;END_FOR&lt;/span&gt;

&lt;span class="nv"&gt;numInsertSort&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;TRUE&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;</summary></entry><entry><title>Sorting an array</title><link href="https://forge.codesys.com/forge/talk/Runtime/thread/6ae1b1ff98/?limit=100#31a5/f035/66da/5ba5/1553/b75d" rel="alternate"/><published>2020-09-25T11:51:52.507000Z</published><updated>2020-09-25T11:51:52.507000Z</updated><author><name>dFx</name><uri>https://forge.codesys.com/u/dfx/</uri></author><id>https://forge.codesys.comee4a54bdcd17dabd0e52b520acc735bca852a9fc</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;&lt;a class="user-mention" href="/u/nothinrandom/"&gt;@nothinrandom&lt;/a&gt;(https://forge.codesys.com/u/nothinrandom/)&lt;/p&gt;
&lt;p&gt;Fixed code with some cleanup.&lt;/p&gt;
&lt;p&gt;Feel free to add it to your base.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nv"&gt;FUNCTION&lt;/span&gt; &lt;span class="nv"&gt;numInsertSort&lt;/span&gt; : &lt;span class="nv"&gt;BOOL&lt;/span&gt;
&lt;span class="nv"&gt;VAR_INPUT&lt;/span&gt;
    &lt;span class="nv"&gt;pbBuffer&lt;/span&gt;                : &lt;span class="nv"&gt;POINTER&lt;/span&gt; &lt;span class="nv"&gt;TO&lt;/span&gt; &lt;span class="nv"&gt;BYTE&lt;/span&gt;&lt;span class="c1"&gt;;      // pointer to buffer&lt;/span&gt;
    &lt;span class="nv"&gt;diElements&lt;/span&gt;              : &lt;span class="nv"&gt;DINT&lt;/span&gt;&lt;span class="c1"&gt;;                 // array length&lt;/span&gt;
    &lt;span class="nv"&gt;uiDataType&lt;/span&gt;              : &lt;span class="nv"&gt;UINT&lt;/span&gt;&lt;span class="c1"&gt;;                 // data type: SINT(1), USINT/BYTE(2), INT(3), UINT/WORD(4), DINT(5), UDINT/DWORD(6), LINT(7), ULINT/LWORD(8), REAL(9), LREAL(10)&lt;/span&gt;
    &lt;span class="nv"&gt;bOrder&lt;/span&gt;                  : &lt;span class="nv"&gt;BOOL&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;FALSE&lt;/span&gt;&lt;span class="c1"&gt;;        // default ascending&lt;/span&gt;
&lt;span class="nv"&gt;END_VAR&lt;/span&gt;
&lt;span class="nv"&gt;VAR&lt;/span&gt;
    &lt;span class="nv"&gt;_uiDataSize&lt;/span&gt;             : &lt;span class="nv"&gt;UINT&lt;/span&gt;&lt;span class="c1"&gt;;                 // element size&lt;/span&gt;
    &lt;span class="nv"&gt;_diIndex1&lt;/span&gt;               : &lt;span class="nv"&gt;DINT&lt;/span&gt;&lt;span class="c1"&gt;;                 // loop index&lt;/span&gt;
    &lt;span class="nv"&gt;_diMaxIndex&lt;/span&gt;             : &lt;span class="nv"&gt;DINT&lt;/span&gt;&lt;span class="c1"&gt;;                 // loop highest index tested&lt;/span&gt;
    &lt;span class="nv"&gt;_diMinIndex&lt;/span&gt;             : &lt;span class="nv"&gt;DINT&lt;/span&gt;&lt;span class="c1"&gt;;                 // loop lowest index tested&lt;/span&gt;
    &lt;span class="nv"&gt;_diCurrentIndex&lt;/span&gt;         : &lt;span class="nv"&gt;DINT&lt;/span&gt;&lt;span class="c1"&gt;;                 // loop current tested element index&lt;/span&gt;
    &lt;span class="nv"&gt;_bSwapped&lt;/span&gt;               : &lt;span class="nv"&gt;BOOL&lt;/span&gt;&lt;span class="c1"&gt;;                 // optimization&lt;/span&gt;
    &lt;span class="nv"&gt;_pbTemp&lt;/span&gt;                 : &lt;span class="nv"&gt;POINTER&lt;/span&gt; &lt;span class="nv"&gt;TO&lt;/span&gt; &lt;span class="nv"&gt;BYTE&lt;/span&gt;&lt;span class="c1"&gt;;      // pointer to temp&lt;/span&gt;
    &lt;span class="nv"&gt;_psiInsertElement&lt;/span&gt;       : &lt;span class="nv"&gt;POINTER&lt;/span&gt; &lt;span class="nv"&gt;TO&lt;/span&gt; &lt;span class="nv"&gt;REAL&lt;/span&gt;&lt;span class="c1"&gt;;      // pointer operator&lt;/span&gt;
    &lt;span class="nv"&gt;_psiCurrentElement&lt;/span&gt;      : &lt;span class="nv"&gt;POINTER&lt;/span&gt; &lt;span class="nv"&gt;TO&lt;/span&gt; &lt;span class="nv"&gt;REAL&lt;/span&gt;&lt;span class="c1"&gt;;      // pointer operator&lt;/span&gt;
    &lt;span class="nv"&gt;_abTemp&lt;/span&gt;                 : &lt;span class="nv"&gt;ARRAY&lt;/span&gt; [&lt;span class="mi"&gt;1&lt;/span&gt;..&lt;span class="mi"&gt;8&lt;/span&gt;] &lt;span class="nv"&gt;OF&lt;/span&gt; &lt;span class="nv"&gt;BYTE&lt;/span&gt;&lt;span class="c1"&gt;; // store temp value&lt;/span&gt;
&lt;span class="nv"&gt;END_VAR&lt;/span&gt;

&lt;span class="nv"&gt;_uiDataSize&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;FOR&lt;/span&gt; &lt;span class="nv"&gt;_diIndex1&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="nv"&gt;TO&lt;/span&gt; &lt;span class="nv"&gt;diElements&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;DO&lt;/span&gt;
    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;highest&lt;/span&gt; &lt;span class="nv"&gt;index&lt;/span&gt; &lt;span class="nv"&gt;tested&lt;/span&gt;
    &lt;span class="nv"&gt;_diMaxIndex&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;_diIndex1&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;lowest&lt;/span&gt; &lt;span class="nv"&gt;index&lt;/span&gt; &lt;span class="nv"&gt;tested&lt;/span&gt;
    &lt;span class="nv"&gt;_diMinIndex&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;element&lt;/span&gt; &lt;span class="nv"&gt;we&lt;/span&gt; &lt;span class="nv"&gt;need&lt;/span&gt; &lt;span class="nv"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;insert&lt;/span&gt;
    &lt;span class="nv"&gt;_psiInsertElement&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;pbBuffer&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nv"&gt;DINT_TO_DWORD&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;_uiDataSize&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nv"&gt;_diIndex1&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;REPEAT&lt;/span&gt;
        &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;current&lt;/span&gt; &lt;span class="nv"&gt;test&lt;/span&gt; &lt;span class="nv"&gt;index&lt;/span&gt;
        &lt;span class="nv"&gt;_diCurrentIndex&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt;  &lt;span class="nv"&gt;_diMinIndex&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nv"&gt;TRUNC&lt;/span&gt;&lt;span class="ss"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;_diMaxIndex&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nv"&gt;_diMinIndex&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;get&lt;/span&gt; &lt;span class="nv"&gt;element&lt;/span&gt; &lt;span class="nv"&gt;at&lt;/span&gt; &lt;span class="nv"&gt;current&lt;/span&gt; &lt;span class="nv"&gt;test&lt;/span&gt; &lt;span class="nv"&gt;index&lt;/span&gt;
        &lt;span class="nv"&gt;_psiCurrentElement&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;pbBuffer&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nv"&gt;DINT_TO_DWORD&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;_uiDataSize&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nv"&gt;_diCurrentIndex&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;test&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nv"&gt;ordering&lt;/span&gt;
        &lt;span class="k"&gt;IF&lt;/span&gt; &lt;span class="nv"&gt;_psiCurrentElement&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;_psiInsertElement&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
            &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;ascending&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nv"&gt;descending&lt;/span&gt;
            &lt;span class="k"&gt;IF&lt;/span&gt; &lt;span class="nv"&gt;NOT&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;bOrder&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
               &lt;span class="nv"&gt;_diMaxIndex&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;_diCurrentIndex&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;ELSE&lt;/span&gt;
               &lt;span class="nv"&gt;_diMinIndex&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;_diCurrentIndex&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
            &lt;span class="nv"&gt;END_IF&lt;/span&gt;
        &lt;span class="k"&gt;ELSE&lt;/span&gt;
            &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;ascending&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nv"&gt;descending&lt;/span&gt;
            &lt;span class="k"&gt;IF&lt;/span&gt; &lt;span class="nv"&gt;NOT&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;bOrder&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
               &lt;span class="nv"&gt;_diMinIndex&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;_diCurrentIndex&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;ELSE&lt;/span&gt;
               &lt;span class="nv"&gt;_diMaxIndex&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;_diCurrentIndex&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
            &lt;span class="nv"&gt;END_IF&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
        &lt;span class="nv"&gt;END_IF&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;UNTIL&lt;/span&gt;
        &lt;span class="nv"&gt;_diMaxIndex&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nv"&gt;_diMinIndex&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
    &lt;span class="nv"&gt;END_REPEAT&lt;/span&gt;
    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;Save&lt;/span&gt; &lt;span class="nv"&gt;value&lt;/span&gt; &lt;span class="nv"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;insert&lt;/span&gt;
    &lt;span class="nv"&gt;SysMemCpy&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;pDest&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;ADR&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;_abTemp&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;, &lt;span class="nv"&gt;pSrc&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;_psiInsertElement&lt;/span&gt;, &lt;span class="nv"&gt;udiCount&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;_uiDataSize&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;Move&lt;/span&gt; &lt;span class="nv"&gt;block&lt;/span&gt;
    &lt;span class="nv"&gt;SysMemMove&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;pDest&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;pbBuffer&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nv"&gt;DINT_TO_DWORD&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;_uiDataSize&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;_diMaxIndex&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="ss"&gt;))&lt;/span&gt; , &lt;span class="nv"&gt;pSrc&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;pbBuffer&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nv"&gt;DINT_TO_DWORD&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;_uiDataSize&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nv"&gt;_diMaxIndex&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; , &lt;span class="nv"&gt;udiCount&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;DINT_TO_DWORD&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;_uiDataSize&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;_diIndex1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nv"&gt;_diMaxIndex&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="ss"&gt;))&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;key&lt;/span&gt;
    &lt;span class="nv"&gt;SysMemCpy&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;pDest&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;pbBuffer&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nv"&gt;DINT_TO_DWORD&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;_uiDataSize&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nv"&gt;_diMaxIndex&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;, &lt;span class="nv"&gt;pSrc&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;ADR&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;_abTemp&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;, &lt;span class="nv"&gt;udiCount&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;_uiDataSize&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;

&lt;span class="nv"&gt;END_FOR&lt;/span&gt;

&lt;span class="nv"&gt;numInsertSort&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;TRUE&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;</summary></entry></feed>