XML: Bubble Sort utilizing XMLVARs: Difference between revisions

From FSDeveloper Wiki
Jump to navigationJump to search
(Created page with " Recently, a question about sorting has come up. The context was an ICAO Search of Facility types which returns ICAO strings in alphabetical order. However, each ICAO rep...")
 
No edit summary
Line 61: Line 61:
     Notes:
     Notes:


         (L:sort_len, number) is the array length. For example, IcaoSearchMatchedIcaosNumber
         - (L:sort_len, number) is the array length. For example, IcaoSearchMatchedIcaosNumber
         The SortInit sequence was used for testing purposes only. It stores 2, 1, 4, 8, 7, and 0 into XMLVARs named 'sort_test0' through 'sort_test5'. In a real application, GeoCalcDistance information would actually generate the values to be stored in these XMLVARs and a SortInit sequence would probably never be needed.
         - The SortInit sequence was used for testing purposes only. It stores 2, 1, 4, 8, 7, and 0 into XMLVARs named 'sort_test0' through 'sort_test5'. In a real application, GeoCalcDistance information would actually generate the values to be stored in these XMLVARs and a SortInit sequence would probably never be needed.
         The bottom 6 lines in the Update section simply read the XMLVARs and store then into traditional L:Vars so that BlackBox can display them (so you can see what is happening before and after the sort is applied)
         - The bottom 6 lines in the Update section simply read the XMLVARs and store then into traditional L:Vars so that BlackBox can display them (so you can see what is happening before and after the sort is applied)
         A Mouse Area 'click area' is used to execute the sort macro, @sort('sort_test', 6). The number 6 is the array length to be sorted. In the real example I postulated, it would be written @sort('sort_test',C:fs9gps:IcaoSearchMatchedIcaosNumber)
         - A Mouse Area 'click area' is used to execute the sort macro, @sort('sort_test', 6). The number 6 is the array length to be sorted. In the real example I postulated, it would be written @sort('sort_test',C:fs9gps:IcaoSearchMatchedIcaosNumber)
 
    The following is a screen shot of a BlackBox display. On top are the initial values of (L:SortTest0, number) through (L:SortTest5, number). On the bottom are the values after the bubble sort. Tested in FS9 but of course, also works in FSX (XMLVARs has a FS9 module and a FSX module)

Revision as of 10:41, 17 February 2014


   Recently, a question about sorting has come up. The context was an ICAO Search of Facility types which returns ICAO strings in alphabetical order. However, each ICAO represents a Facility that has a certain distance from the user's aircraft, and a sort according to distance is needed.
   Acknowledgements are owed to Robbie McElrath who hammered out the Bubble Sort XML in a few minutes (thank you, Robbie) and Tom Aguilo, for providing XMLVARs. The sort script that follows makes use of the array-forming capabilities of XMLVARS. Thanks, Tom.
   Code:
    <Macro Name="sort">
      @2 (>L:sort_len, number)
      :127
         0 (>L:sort_swapped, bool)
         0 sp0
         :128
            l0 ++ s0 (L:sort_len, number) >= if{ g129 }
            @1 l0 -- scat s10 (>C:XMLVARS:SearchVarName, string) (C:XMLVARS:NumberValue, number) s11
            @1 l0    scat     (>C:XMLVARS:SearchVarName, string) (C:XMLVARS:NumberValue, number) s12 >
                if{
                  l11 (>C:XMLVARS:NumberValue, number)
                  l10 (>C:XMLVARS:SearchVarName, string) l12 (>C:XMLVARS:NumberValue, number)
                  1 (>L:sort_swapped, bool)
                }
            g128
         :129
         (L:sort_swapped, bool) if{ g127 }
    </Macro>

    <Macro Name="store">
      @1 @2 scat (>C:XMLVARS:StoreVarName, string) (>C:XMLVARS:NumberValue, number)
    </Macro>  

    <Update Frequency="18" Hidden="No">      
    (L:SortInit, bool) 0 ==
        if{
            2 @store('sort_test', 0)
            1 @store('sort_test', 1)
            4 @store('sort_test', 2)
            8 @store('sort_test', 3)
            7 @store('sort_test', 4)
            0 @store('sort_test', 5)
            1 (>L:SortInit, bool)
        }  
                   
        'sort_test0' (>C:XMLVARS:SearchVarName,string) (C:XMLVARS:NumberValue,number) (>L:SortTest0, number)       
        'sort_test1' (>C:XMLVARS:SearchVarName,string) (C:XMLVARS:NumberValue,number) (>L:SortTest1, number)  
        'sort_test2' (>C:XMLVARS:SearchVarName,string) (C:XMLVARS:NumberValue,number) (>L:SortTest2, number)  
        'sort_test3' (>C:XMLVARS:SearchVarName,string) (C:XMLVARS:NumberValue,number) (>L:SortTest3, number)  
        'sort_test4' (>C:XMLVARS:SearchVarName,string) (C:XMLVARS:NumberValue,number) (>L:SortTest4, number)  
        'sort_test5' (>C:XMLVARS:SearchVarName,string) (C:XMLVARS:NumberValue,number) (>L:SortTest5, number)  
    </Update>

    <Area Left="150" Top="130" Width="16" Height="16">
        <Cursor Type="Hand" />
            <Click Kind="LeftSingle+RightSingle">
                (L:SortMacroExecuted,enum) ++ (>L:SortMacroExecuted,enum)
                @sort('sort_test', 6)
            </Click>
    </Area>    
   Notes:
       - (L:sort_len, number) is the array length. For example, IcaoSearchMatchedIcaosNumber
       - The SortInit sequence was used for testing purposes only. It stores 2, 1, 4, 8, 7, and 0 into XMLVARs named 'sort_test0' through 'sort_test5'. In a real application, GeoCalcDistance information would actually generate the values to be stored in these XMLVARs and a SortInit sequence would probably never be needed.
       - The bottom 6 lines in the Update section simply read the XMLVARs and store then into traditional L:Vars so that BlackBox can display them (so you can see what is happening before and after the sort is applied)
       - A Mouse Area 'click area' is used to execute the sort macro, @sort('sort_test', 6). The number 6 is the array length to be sorted. In the real example I postulated, it would be written @sort('sort_test',C:fs9gps:IcaoSearchMatchedIcaosNumber)