Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
How to format a While... Wend correctly?
#30
Quote:It's an overflow error. /sigh

Add this one line to the top of the code and try it:

Code: (Select All)
DefLng A-Z

s is a SINGLE by default. The overall dictionary is larger than a single can hold, so it reads the first 255000 or so words and definition and then says, "Blah!!!"

I anticipated that and had this line in code:
Dim As Long l, count, sp, ep

No s in there???

I am trying again with all varaibles DIM'd...


BTW you are using two different varaibles for Load_Time#1 and LoadTimer#1 no wonder it's 0.


yep! it is still erroring out with subscript out of range for dictionary at 3000000???
Code: (Select All)
Option _Explicit
Dim dict$, temp$, temp1$
dict$ = "Collins.txt"

Screen _NewImage(800, 600, 32)

Type Dict_Type
    As String Word, Definition
End Type

ReDim Shared Dict(3000000) As Dict_Type
Dim load_time1#, load_time2#, t#, t1#

load_time1# = Timer
temp$ = readfile$(dict$) ' <<<< made my own

'Print Mid$(temp$, 1, 500) ' test load
'Sleep
Dim i As Integer, k As Integer
Dim As Long l, count, sp, ep, f
sp = 1
Do
    ep = InStr(sp, temp$, Chr$(13) + Chr$(10))
    temp1$ = Mid$(temp$, sp, ep - sp)
    'Print temp1$
    l = InStr(temp1$, Chr$(9)) 'tab separated data file

    count = count + 1


    Dict(count).Word = _Trim$(Left$(temp1$, l - 1))
    Dict(count).Definition = _Trim$(Mid$(temp1$, l + 1))
    'Print count, Dict(count).Word, sp, Len(temp$) ' <<<< 3,000,000 not enough WTH??? it's wrapping around and starting over??

    sp = ep + 2

Loop Until sp >= Len(temp$) ' Or count > 279496 ' <<<<<<  stop the insane wrap around!!!
load_time2# = Timer

ReDim _Preserve Dict(count) As Dict_Type

Dim Junk(10) As String
Data cheese,dog,cat,elephant,rootbeer,house,food,drink,zebra,mouse
For i = 1 To 10
    Read Junk(i)
Next


t# = Timer
For k = 1 To 10000
    For i = 1 To 10
        f = FindWord&(Junk(i))
        If k = 1 Then 'no need to scroll the screen and print the words repeatedly
            If f = 0 Then
                Print Junk(i), "Word not found"
            Else
                Print Junk(i), Dict(FindWord(Junk(i))).Definition
            End If
        End If
    Next
Next
t1# = Timer

Print Using "###.######## seconds to load dictionary with ###,###,### words."; load_time2# - load_time1#, count
Print Using "###.######## seconds to find #### words and definitions, ###,###,### repeated times."; t1# - t#, i - 1, k - 1

Function FindWord& (word$)
    Dim As Long low, hi, test
    low = 1: hi = UBound(Dict)
    While low <= hi
        test = Int((low + hi) / 2)
        Select Case _StriCmp(Dict(test).Word, word$)
            Case 0
                'Print "found"; test
                FindWord = test: Exit Function
            Case -1
                'Print "low"; Dict(test).Word
                low = test + 1
            Case 1
                'Print "high"; Dict(test).Word
                hi = test - 1
        End Select
    Wend
End Function

Function readfile$ (f$)
    Dim buff$
    If _FileExists(f$) Then
        Open f$ For Binary As #1
        buff$ = Space$(LOF(1))
        Get #1, , buff$
        readfile$ = buff$
        Close #1
    End If
End Function

So something else is going on that using count to control stop fixes.

BTW .39 +/- secs to load dictionary well within acceptable range!
b = b + ...
Reply


Messages In This Thread
RE: How to format a While... Wend correctly? - by bplus - 02-29-2024, 06:33 PM



Users browsing this thread: 19 Guest(s)