home *** CD-ROM | disk | FTP | other *** search
- {
- 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.