I'm trying a sort a mailling list. The code below works on trivial amounts
of data, on larger sets the namearray outputs correctly but the mailarray
is corrupt. Free memory is 285,024 bytes before the REDIM statements.
TYPE MailHeader
NumIn AS LONG
NumSort AS LONG
DefCity AS STRING * 15
DefState AS STRING * 2
DefZip AS STRING * 5
DefSuf AS STRING * 25
Junk AS STRING * 45
END TYPE
TYPE MailRecord
FullName AS STRING * 25
Address AS STRING * 30
City AS STRING * 15
State AS STRING * 2
Zip AS STRING * 9
Code AS STRING * 1
Deleted AS STRING * 1
Acct AS STRING * 6
EntryDate AS INTEGER
Junk AS STRING * 9
END TYPE
DIM NameArray(1) AS STRING * 25
DIM HUGE MailArray(1) AS MailRecord
IF FRE(-1) > ((LEN(MailArray(1).FullName) * MailH.NumIn) + (LEN(MailArray(1)) * MailH.NumIn)) THEN
REDIM NameArray (MailH.NumIn)
REDIM MailArray (MailH.NumIn)
i = 1
j = 1
WHILE i <= MailH.NumIn
CALL ReadRecord(FileNum,"",VARPTR32(MailArray(j)),i+1,LEN(MailArray(1)),%rNone)
IF MailArray(j).Deleted <> "Y" THEN
NameArray(j) = MailArray(j).FullName
INCR j
END IF
INCR i
WEND
MailH.NumSort = j - 1
MailH.NumIn = MailH.NumSort
CALL WriteRecord(FileNum,"",VARPTR32(MailH),1,LEN(MailH),%rNone)
TempFileNum = OpenFile ("Nametest.dat",3,3,1,25) 'Only used for debugging
REDIM PRESERVE NameArray(MailH.NumSort)
REDIM PRESERVE MailArray(MailH.NumSort)
ARRAY SORT NameArray() ,COLLATE UCASE ,TAGARRAY MailArray()
FOR i = 1 TO MailH.NumIn
CALL WriteRecord(TempFileNum,"",VARPTR32(Namearray(i)),i,25,%rNone)
CALL WriteRecord(FileNum,"",VARPTR32(MailArray(i)),i+1,LEN(MailArray(1)),%rNone)
NEXT
CloseFile TempFileNum
SETEOF #FileNum
ERASE NameArray,MailArray
END IF
------------------
of data, on larger sets the namearray outputs correctly but the mailarray
is corrupt. Free memory is 285,024 bytes before the REDIM statements.
TYPE MailHeader
NumIn AS LONG
NumSort AS LONG
DefCity AS STRING * 15
DefState AS STRING * 2
DefZip AS STRING * 5
DefSuf AS STRING * 25
Junk AS STRING * 45
END TYPE
TYPE MailRecord
FullName AS STRING * 25
Address AS STRING * 30
City AS STRING * 15
State AS STRING * 2
Zip AS STRING * 9
Code AS STRING * 1
Deleted AS STRING * 1
Acct AS STRING * 6
EntryDate AS INTEGER
Junk AS STRING * 9
END TYPE
DIM NameArray(1) AS STRING * 25
DIM HUGE MailArray(1) AS MailRecord
IF FRE(-1) > ((LEN(MailArray(1).FullName) * MailH.NumIn) + (LEN(MailArray(1)) * MailH.NumIn)) THEN
REDIM NameArray (MailH.NumIn)
REDIM MailArray (MailH.NumIn)
i = 1
j = 1
WHILE i <= MailH.NumIn
CALL ReadRecord(FileNum,"",VARPTR32(MailArray(j)),i+1,LEN(MailArray(1)),%rNone)
IF MailArray(j).Deleted <> "Y" THEN
NameArray(j) = MailArray(j).FullName
INCR j
END IF
INCR i
WEND
MailH.NumSort = j - 1
MailH.NumIn = MailH.NumSort
CALL WriteRecord(FileNum,"",VARPTR32(MailH),1,LEN(MailH),%rNone)
TempFileNum = OpenFile ("Nametest.dat",3,3,1,25) 'Only used for debugging
REDIM PRESERVE NameArray(MailH.NumSort)
REDIM PRESERVE MailArray(MailH.NumSort)
ARRAY SORT NameArray() ,COLLATE UCASE ,TAGARRAY MailArray()
FOR i = 1 TO MailH.NumIn
CALL WriteRecord(TempFileNum,"",VARPTR32(Namearray(i)),i,25,%rNone)
CALL WriteRecord(FileNum,"",VARPTR32(MailArray(i)),i+1,LEN(MailArray(1)),%rNone)
NEXT
CloseFile TempFileNum
SETEOF #FileNum
ERASE NameArray,MailArray
END IF
------------------
Comment