Error because for i=0, out of bound of '_Buffer(i-1)'.
In addition, to optimize execution code, we can replace anywhere the test on the string '_Buffer(x)' by a test on 'Len(_Buffer(x))':
Code: Select all
'' Null string item removal from an array of string - comparison tests
''=========================================================================
Function TOURIST1(_Buffer() As string) As Long
Dim As String TemporaryBuffer()
ReDim TemporaryBuffer(UBound(_Buffer))
Dim As Integer temporaryBufferItemCounter = 0
For i As Integer=0 To UBound(_Buffer)
If Len(_Buffer(i)) > 0 Then
TemporaryBuffer(temporaryBufferItemCounter) = _Buffer(i)
temporaryBufferItemCounter += 1
EndIf
Next i
For i As Integer=0 To temporaryBufferItemCounter
_Buffer(i) = TemporaryBuffer(i)
Next i
ReDim Preserve _Buffer(0 To temporaryBufferItemCounter - 1)
Return (Ubound(_Buffer) - LBound(_Buffer))
End Function 'TOURIST1
''=========================================================================
Function FXM1(_Buffer() As string) As Long
Dim n As Integer = Lbound(_Buffer)
Do While n <= Ubound(_Buffer)
If Len(_Buffer(n)) = 0 Then
If Ubound(_Buffer) = Lbound(_Buffer) Then
Erase _Buffer
Else
For i As Integer = n To Ubound(_Buffer) - 1
Swap _Buffer(i), _Buffer(i+1)
Next i
Redim Preserve _Buffer(LBound(_Buffer) To Ubound(_Buffer) - 1)
End If
Else
n += 1
End If
Loop
Return (Ubound(_Buffer) - LBound(_Buffer))
End Function 'FXM1
''=========================================================================
Function GRINDSTONE1(_Buffer() As string) As Long
Dim As Long j = LBound(_Buffer)
For i As Long = LBound(_Buffer) To UBound(_Buffer)
If Len(_Buffer(i)) Then
Swap _Buffer(i),_Buffer(j)
j += 1
EndIf
Next
'redim array
If j > LBound(_Buffer) Then
ReDim Preserve _Buffer(LBound(_Buffer) To j-1)
Else
ReDim Preserve _Buffer(LBound(_Buffer) To j)
EndIf
Return (Ubound(_Buffer) - LBound(_Buffer))
End Function 'GRINDSTONE1
''=========================================================================
Function TOURIST2(_Buffer() As string) As Long
Dim As Integer i, n, invalidItemCounter
i = 0
n = 1
invalidItemCounter = 0
While i <= UBound(_Buffer)
If Len(_Buffer(0)) = 0 Then invalidItemCounter += 1
If i>0 Andalso Len(_Buffer(i-1)) = 0 Then invalidItemCounter += 1
While Len(_Buffer(i))=0 And i+n <= UBound(_Buffer)
Swap _Buffer(i), _Buffer(i+n)
n += 1
Wend
n = 1
i += 1
Wend
ReDim Preserve _Buffer(UBound(_Buffer) - invalidItemCounter -1)
Return (Ubound(_Buffer) - LBound(_Buffer))
End Function 'TOURIST2
''=========================================================================
Function SARG1(_Buffer() As String) As Long
Dim As Long empty=-1
For i As Long =LBound(_Buffer) To UBound(_Buffer)
If Len(_Buffer(i))=0 Then
If empty=-1 Then empty=i
Continue For
EndIf
If empty=-1 Then Continue For
Swap _Buffer(i),_Buffer(empty)
empty+=1
Next i
If empty = 0 Then
Erase _Buffer
ElseIf empty > 0 Then
ReDim Preserve _Buffer(LBound(_Buffer) To empty-1)
End If
Return (Ubound(_Buffer) - LBound(_Buffer))
End Function 'SARG1
''=========================================================================
Function DODICAT1(_Buffer() As string) As Long
dim as integer n = -1
do
n=n+1
If Len(_Buffer(n))=0 then
'arraydelete(_Buffer(),n)
If n>=Lbound(_Buffer) And n<=Ubound(_Buffer) Then
For x As Integer=n To Ubound(_Buffer)-1
_Buffer(x)=_Buffer(x+1)
Next x
ReDim Preserve _Buffer(Lbound(_Buffer) To Ubound(_Buffer)-1)
End If
n=n-1
EndIf
if n=ubound(_Buffer) then exit do '(the ubound changes of course)
Loop
Return (Ubound(_Buffer) - LBound(_Buffer))
End Function 'DODICAT1
''=========================================================================
Function TEST1(_Buffer() As string) As Long
''Must provide the new _Buffer resized
''Add your method here
Return (Ubound(_Buffer) - LBound(_Buffer))
End Function 'TEST1
''=========================================================================
Declare Function Maximum(ByVal a As Double, ByVal b As Double) As Double
Declare Sub Initialize()
Declare Sub BufferCreate()
Declare Sub ShowBuffer(_bufferToShow() As String, ByVal _title As String = "BUFFER CONTENT")
Declare Sub SaveBuffer(_bufferToSave() As String, _savedBuffer() As String)
Declare Sub RestoreBuffer(_bufferToBeRestored() As String, _savedBuffer() As String)
Dim Shared As Long _loopCounter
Dim Shared As String buffer(), initialBuffer(), resultBuffer()
Dim As Long _maxItemAmount = 6+Rnd*48 '*
ReDim buffer(0 to _maxItemAmount)
ReDim initialBuffer(0 to _maxItemAmount)
ReDim resultBuffer(0 to _maxItemAmount)
Dim As Long resultUBound
''---------------------------------------------------------------------MAIN
Initialize()
BufferCreate()
Cls
ShowBuffer(Buffer(), "INITIAL BUFFER")
Locate 25, 30 : ? "PRESS A KEY TO CONTINUE" ;
Sleep
SaveBuffer(Buffer(), initialBuffer())
Cls
Dim As Double testTime0 = Timer
''*************************************************************TEST0
resultUBound = TOURIST1(buffer()) '*
testTime0 = Timer - testTime0
ReDim resultBuffer(0 to resultUBound)
For _loopCounter = 0 To UBound(resultBuffer) - LBound(resultBuffer)
resultBuffer(_loopCounter ) = buffer(LBound(resultBuffer) + _loopCounter)
Next _loopCounter
ShowBuffer(resultBuffer(), "RESULT BUFFER TEST0 = TOURIST1")
Locate 19, 1 : ? "Time ellapsed * 1e+5= "; testTime0 * 1e+5
RestoreBuffer(buffer(), initialBuffer())
Locate 25, 30 : ? "PRESS A KEY TO CONTINUE" ;
Sleep
Cls
Dim As Double testTime1 = Timer
''*************************************************************TEST1
resultUBound = FXM1(buffer()) '*
testTime1 = Timer - testTime1
ReDim resultBuffer(0 to resultUBound)
For _loopCounter = 0 To UBound(resultBuffer) - LBound(resultBuffer)
resultBuffer(_loopCounter ) = buffer(LBound(resultBuffer) + _loopCounter)
Next _loopCounter
ShowBuffer(resultBuffer(), "RESULT BUFFER TEST1 = FXM1")
Locate 19, 1 : ? "Time ellapsed * 1e+5= "; testTime1 * 1e+5
RestoreBuffer(buffer(), initialBuffer())
Locate 25, 30 : ? "PRESS A KEY TO CONTINUE" ;
Sleep
Cls
Dim As Double testTime2 = Timer
''*************************************************************TEST2
resultUBound = GRINDSTONE1(buffer()) '*
testTime2 = Timer - testTime2
ReDim resultBuffer(0 to resultUBound)
For _loopCounter = 0 To UBound(resultBuffer) - LBound(resultBuffer)
resultBuffer(_loopCounter ) = buffer(LBound(resultBuffer) + _loopCounter)
Next _loopCounter
ShowBuffer(resultBuffer(), "RESULT BUFFER TEST2 = GRINDSTONE1")
Locate 19, 1 : ? "Time ellapsed * 1e+5= "; testTime2 * 1e+5
RestoreBuffer(buffer(), initialBuffer())
Locate 25, 30 : ? "PRESS A KEY TO CONTINUE" ;
Sleep
Cls
Dim As Double testTime3 = Timer
''*************************************************************TEST3
resultUBound = TOURIST2(buffer()) '*
testTime3 = Timer - testTime3
ReDim resultBuffer(0 to resultUBound)
For _loopCounter = 0 To UBound(resultBuffer) - LBound(resultBuffer)
resultBuffer(_loopCounter ) = buffer(LBound(resultBuffer) + _loopCounter)
Next _loopCounter
ShowBuffer(resultBuffer(), "RESULT BUFFER TEST3 = TOURIST2")
Locate 19, 1 : ? "Time ellapsed * 1e+5= "; testTime3 * 1e+5
RestoreBuffer(buffer(), initialBuffer())
Locate 25, 30 : ? "PRESS A KEY TO CONTINUE" ;
Sleep
Cls
Dim As Double testTime4 = Timer
''*************************************************************TEST4
resultUBound = SARG1(buffer()) '*
testTime4 = Timer - testTime4
ReDim resultBuffer(0 to resultUBound)
For _loopCounter = 0 To UBound(resultBuffer) - LBound(resultBuffer)
resultBuffer(_loopCounter ) = buffer(LBound(resultBuffer) + _loopCounter)
Next _loopCounter
ShowBuffer(resultBuffer(), "RESULT BUFFER TEST4 = SARG1")
Locate 19, 1 : ? "Time ellapsed * 1e+5= "; testTime4 * 1e+5
RestoreBuffer(buffer(), initialBuffer())
Locate 25, 30 : ? "PRESS A KEY TO CONTINUE" ;
Sleep
Cls
Dim As Double testTime5 = Timer
''*************************************************************TEST5
resultUBound = DODICAT1(buffer()) '*
testTime5 = Timer - testTime5
ReDim resultBuffer(0 to resultUBound)
For _loopCounter = 0 To UBound(resultBuffer) - LBound(resultBuffer)
resultBuffer(_loopCounter ) = buffer(LBound(resultBuffer) + _loopCounter)
Next _loopCounter
ShowBuffer(resultBuffer(), "RESULT BUFFER TEST5 = DODICAT1")
Locate 19, 1 : ? "Time ellapsed * 1e+5= "; testTime5 * 1e+5
RestoreBuffer(buffer(), initialBuffer())
Locate 25, 30 : ? "PRESS A KEY TO CONTINUE" ;
Sleep
Cls
? "CONCLUSION:"
? "-----------"
Locate 1, 14 : ? " On a array size = "; _maxItemAmount
Locate 2, 14 : ? " Test0 = TOURIST1 runs on "; testTime0
Locate 3, 14 : ? " Test1 = FXM1 runs on "; testTime1
Locate 4, 14 : ? " Test2 = GRINDSTONE1 runs on "; testTime2
Locate 5, 14 : ? " Test3 = TOURIST2 runs on "; testTime3
Locate 6, 14 : ? " Test4 = SARG1 runs on "; testTime4
Locate 7, 14 : ? " Test5 = DODICAT1 runs on "; testTime5
''Draw little graph
For _loopCounter = 12 To 19
Locate _loopCounter, 14 : ? "|";
Next
For _loopCounter = 1 To 50
Locate 20, 12+_loopCounter : ? "-";
Next
''compute max time
Dim As Double maxTime
maxTime = Maximum(testTime0, testTime1)
maxTime = Maximum(maxTime, testTime2)
maxTime = Maximum(maxTime, testTime3)
maxTime = Maximum(maxTime, testTime4)
maxTime = Maximum(maxTime, testTime5)
Locate 21, 16 : ? "'"
Locate 22, 16 : ? "TRS1"
Locate -Int(testTime0*8/maxTime)+20, 16
? IIf(Int(testTime0*8/maxTime) = 0, "X", "*");
Locate 21, 22 : ? "'"
Locate 22, 22 : ? "FXM1"
Locate -Int(testTime1*8/maxTime)+20, 22
? IIf(Int(testTime1*8/maxTime) = 0, "X", "*");
Locate 21, 28 : ? "'"
Locate 22, 28 : ? "GND1"
Locate -Int(testTime2*8/maxTime)+20, 28
? IIf(Int(testTime2*8/maxTime) = 0, "X", "*");
Locate 21, 34 : ? "'"
Locate 22, 34 : ? "TRS2"
Locate -Int(testTime3*8/maxTime)+20, 34
? IIf(Int(testTime3*8/maxTime) = 0, "X", "*");
Locate 21, 40 : ? "'"
Locate 22, 40 : ? "SRG1"
Locate -Int(testTime4*8/maxTime)+20, 40
? IIf(Int(testTime4*8/maxTime) = 0, "X", "*");
Locate 21, 46 : ? "'"
Locate 22, 46 : ? "DOD1"
Locate -Int(testTime5*8/maxTime)+20, 46
? IIf(Int(testTime5*8/maxTime) = 0, "X", "*");
Sleep : End
''-------------------------------------------------------------------------
Function Maximum(ByVal a As Double, ByVal b As Double) As Double
Return IIf(a > b, a, b)
End Function
Sub Initialize()
Screen 0
Cls
Randomize Timer
End Sub
Sub BufferCreate()
''Create a buffer -- array of string
''And fill it with null and not null items
For _loopCounter = 0 To UBound(buffer)
If Rnd*100 > 49 Then
buffer(_loopCounter)="item" & _loopCounter
Else
buffer(_loopCounter)=""
End If
Next _loopCounter
End Sub
Sub ShowBuffer(_bufferToShow() As String, ByVal _title As String = "BUFFER CONTENT")
''Display Buffer
? _title
For _loopCounter = 1 To Len(_title)
? "-" ;
Next _loopCounter
?
For _loopCounter = 0 To UBound(_bufferToShow)
Locate (_loopCounter) Mod 15 + 3, (26*Int((_loopCounter ) / 15))
? "index="; _loopCounter; " Bufr("; _loopCounter; ")="; Buffer(_loopCounter)
Next _loopCounter
Locate 18, 1 : ? "UBound(Buffer)="; UBound(_bufferToShow) : ?
End Sub
Sub SaveBuffer(_bufferToSave() As String, _savedBuffer() As String)
For _loopCounter = 0 To UBound(_bufferToSave)
_savedBuffer(_loopCounter) = _bufferToSave(_loopCounter)
Next _loopCounter
End Sub
Sub RestoreBuffer(_bufferToBeRestored() As String, _savedBuffer() As String)
''Restore initial buffer
ReDim _bufferToBeRestored(UBound(_savedBuffer))
For _loopCounter = 0 To UBound(_savedBuffer)
_bufferToBeRestored(_loopCounter) = _savedBuffer(_loopCounter)
Next _loopCounter
End Sub
'----eof----