Compare two VLU arrays for first one being greater than, equal to, or less than the second. The function returns 3 for greater than, 2 for equal to, 1 for less than and 0 for a leading zero error.
To include only the compare function in a DLL directly from this source file put the following lines in the DLL source:
%In_DLL = 1 #INCLUDE "CompareVLUs.bas"The #IF will skip the PBMAIN() for you.
The function CompareVLUs should compile in PowerBASIC For Windows (PBWin) Versions 8, 9 or 10 and PowerBASIC Console Compiler (PBCC) Versions 4, 5 or 6. The DEC$() function is new in PBWin 10 and PBCC 6, for earlier versions change to STR$() or FORMAT$(). All PBCC versions will ignore $$CRLF and wrap to next line at console width. The earlier versions of PB will not recognize the double $$ which means use 16 bit characters. Just remove one $ to make 8 bit characters.
'File name Compare_VLUs.bas
'for stand alone testing
#if not %def(%In_DLL)
#compile exe
#dim all
function pbmain () as long
local TestArrayA(), TestArrayB() as dword
local R1, R2A, R2B, R3A, R3B, R3C as long ' "R" for result
'test for leading 0 - - - - - - - - - - - - - - - - - - -
dim TestArrayA(10)
dim TestArrayB(10)
TestArrayA(10) = 1
TestArrayB(9) = 999 'element 10 is zero.
R1 = Compare_VLUs(TestArrayA(), TestArrayB())
'test unequal MSD digit numbers - - - - - - - - - - - - - - -
redim preserve TestArrayB(11)
TestArrayB(11) = 1
R2A = Compare_VLUs(TestArrayA(), TestArrayB())
redim preserve TestArrayB(9)
R2B = Compare_VLUs(TestArrayA(), TestArrayB())
'test equal length arrays - - - - - - - - - - - - - - - - - - - -
redim TestArrayA(9)
redim TestArrayB(9)
'- - with equal value . . . . . . . . . . . . . . .
TestArrayA(9) = 1
TestArrayB(9) = 1
TestArrayA(0) = 1
TestArrayB(0) = 1
R3A = Compare_VLUs(TestArrayA(), TestArrayB())
'- - with less than value . . . . . . . . . . . . .
TestArrayA(0) = 0
R3B = Compare_VLUs(TestArrayA(), TestArrayB())
'- - with greater than value . . . . . . . . . . .
swap TestArrayA(0), TestArrayB(0)
R3C = Compare_VLUs(TestArrayA(), TestArrayB())
? "Lead 0 test is- " + dec$(R1) + " (should be 0)" + $$crlf + _
"unequal digit count test is- " + dec$(R2A) + " (should be 1)" + $$crlf + _
"unequal digit count test is- " + dec$(R2B) + " (should be 3)" + $$crlf + _
"Equal digit count test-" + $$crlf + _
" with equal value is- " + dec$(R3A) + " (should be 2)" + $$crlf + _
" with less than value is- " + dec$(R3B) + " (should be 1)" + $$crlf + _
" with greater than value is- " + dec$(R3C) + " (should be 3)"
end function
#endif
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'Function to be included in DLL.
function Compare_VLUs alias "CompareVLUs" (byref VLU1() as dword, _
byref VLU2() as dword) export as long
local UB1, UB2, CurDig as long
UB1 = ubound(VLU1())
UB2 = ubound(VLU2())
if VLU1(UB1) = 0 or VLU2(UB2) = 0 then
goto IsLead0Err
elseif UB1 > UB2 then
goto IsGreaterThan
elseif UB1 < UB2 then
goto IsLessThan
else 'the UBs are equal, so check digit by digit
for CurDig = UB1 to 0 step -1
if VLU1(CurDig) = VLU2(CurDig) then
if CurDig = 0 then
goto IsEqualTo
else
iterate for
end if
elseif VLU1(CurDig) > VLU2(CurDig) then
goto IsGreaterThan
else 'must be less than
goto IsLessThan
end if
next
end if
goto IsLead0Err
IsGreaterThan:
function = 3
exit function
IsEqualTo:
function = 2
exit function
IsLessThan:
function = 1
exit function
IsLead0Err:
function = 0
end function
Created on 24 December 2021; last edit 24 Dec 2021.
This page Copyright © 2021 Dale Yarker, contained source code and
implemented concept are Copyleft (ɔ).
To Dale's Notebook
| To Programs
|