[Back to TEXTFILE SWAG index] [Back to Main SWAG index] [Original]
{
MARK OUELLET
> I know, Mark, that is what Mike said in his last post on it,
> however, when I tried to make that correction the error simply changed
> from an unrecognized Variable to a Type mismatch. I kept the Program
> and may be able to rework it. I think Mike indicated originally that it
> was untested. I kept a copy and may get back to it later. I thought
> (grin) that you might come along and supply the missing touch!! I've
> profited greatly by the instruction of your skilled hand as well as that
> of Mike's.
The Type mismatch comes from the fact Mike elected to use a general
purpose Pointer Type For his Array rather than defining a new String
Pointer Type.
Ok, you have two possible solutions to the problem. You can (A)
TypeCast every Pointer use With String() as in
if PA[MIDDLE]^ < S
BECOMES
if String(PA[MIDDLE]^) < S
This one is long and requires adding the Typecast to every single
comparison. Or you can (B) define a new StrPointer Type and redefine the
Array to an Array of StrPointer.
Here is a version that should work correctly. I decided to go With the
String Pointer Type since Mike Uses GetMem anyways. if he had been using
NEW() then each allocation would have been For a 255 caracter String but
since he allready Uses GetMem to request just enough to hold the String
then the new Type will pose no problems.
Note that some additions and Modifications have also been done to
make it work. I guess Mike was pretty tired when he wrote this ;-). The
sorting routine does work as is, just as Mike stated. I also took it
upon myself to reformat it to my standards.
}
{$A+,B-,D+,E-,F+,G+,I+,L+,N-,O+,P+,Q+,R+,S+,T+,V-,X+,Y+}
{$M 65520,100000,655360}
{
Written by Mike Copeland and Posted to the Pascal Lessons echo
on April 10th 1993.
Modified by Mark Ouellet on May 3rd 1993 and reposted to Pascal
Lessons echo.
Modifications are not indicated in any way to avoid loading the echo
too much. A File compare of both versions will point out the obvious
modifications and additions.
}
Program Text_File_SORT;
Uses
Dos, Crt, Printer;
Const
MAXL = 10000; { maximum # of Records to be processed }
Type
BBUF = Array[1..16384] of Char;
StrPointer = ^String;
Var
I : Word;
IDX : Word;
P : StrPointer;
S : String;
BP : ^BBUF; { large buffer For Text File i/o }
PA : Array [1..MAXL] of StrPointer;{ Pointer Array }
F : Text;
Procedure Pause;
begin
{ Flush Keyboard buffer }
Asm
Mov AX, 0C00h;
Int 21h
end;
Writeln('Press a key to continue...');
{ Wait For Keypress }
While not KeyPressed do;
{ Flush Keyboard Buffer again, we don't need the key }
Asm
Mov AX, 0C00h;
Int 21h
end;
end;
Procedure L_HSORT (LEFT, RIGHT : Word);{ Lo-Hi QuickSort }
Var
LOWER,
UPPER,
MIDDLE : Word;
PIVOT,
T : String;
Temp : StrPointer;
begin
LOWER := LEFT;
UPPER := RIGHT;
MIDDLE := (LEFT + RIGHT) Shr 1;
PIVOT := PA[MIDDLE]^;
Repeat
While PA[LOWER]^ < PIVOT do
Inc(LOWER);
While PIVOT < PA[UPPER]^ do
Dec(UPPER);
if LOWER <= UPPER then
begin
Temp := PA[LOWER];
PA[LOWER] := PA[UPPER];
PA[UPPER] := Temp;
Inc (LOWER);
Dec (UPPER);
end;
Until LOWER > UPPER;
if LEFT < UPPER then
L_HSORT (LEFT, UPPER);
if LOWER < RIGHT then
L_HSORT (LOWER, RIGHT);
end; { L_HSORT }
begin
ClrScr;
Assign (F,'input.dat');
New (BP);
SetTextBuf (F,BP^);
Reset (F);
IDX := 0;
While not EOF (F) do
begin { read File; load into Heap }
readln (F,S);
Inc (IDX);
GetMem (P,Length(S)+1);
P^ := S;
PA[IDX] := P;
gotoXY (1,22);
Write (IDX:5)
end;
Close (F);
Dispose (BP);
if IDX > 1 then
L_HSORT (1,IDX); { sort the data }
For I := 1 to IDX do begin { display the data }
Writeln (PA[I]^);
if not Boolean(I MOD 23) then
pause;
end;
Writeln ('Finis...')
end.
[Back to TEXTFILE SWAG index] [Back to Main SWAG index] [Original]