Subj : pointer... To : All From : Scott Adams Date : Mon Jan 26 2004 12:35 am Here is a quickie demo of Pointers. I did it in a few minutes. So its not very elaborate. Keep in mind for much more detailed examples SWAG has 43 example codes and demo programs just to be examined. For SWAG a link can be found on my programming page links section @ http://users.cybermax.net/~longshot ------------ Program PTDem; Uses Crt, Dos; type StrArray = Array[1..5000] of String[70]; Begin end. ------------ A basic, simple program. Let's try to create a large string array. In this case however, the above will not work. It clearly is too large (5000x70 = 350000 bytes when borland Dos IDE only supports 64k for its Dos Platform programs). So this will not compile. We have to correct the size to a more manageable size. Program PTDem; Uses Crt, Dos; type StrArray = Array[1..800] of String[70]; Var ICnt : Integer; SAR : StrArray; Begin For ICnt := 1 to 800 do Begin SAR[ICnt] := Chr(Random(65)+1); Writeln(SAR[Icnt]); End; end. ----------- The StrArray is now 800 elements but still length of 70. This is much smaller but compiles to 56K of data. I create a simple counter variable and then a new variable SAR. This StringArrayRecord variable is of same type as Strarray. This is so we can access and store/use the data. But if you compile the basic Type is only 688 bytes but with this new SAR variable the data size goes to 57490 which is still in the 64k limit but huge! The For loop simply stores a random character in the SAR record array (all 800 items). Then writes it to screen. Now this will work but its still alot of space taken up. BTW, I forgot we should put a RANDOMIZE; at the top before the loop to make it truely random (I forgot). ------ Now comes the magic of pointers. Program PTDem; Uses Crt, Dos; type StrArray = Array[1..800] of String[70]; Var Str_Pt : ^StrArray; ICnt : Integer; { SAR : StrArray;} Begin New(Str_Pt); For ICnt := 1 to 800 do Begin Str_Pt^[ICnt] := Chr(Random(65)+1); Writeln(Str_Pt^[Icnt]); End; Dispose(Str_PT); end. 1. Notice I commented out the SAR variable freeing up 57k of data. 2. The new part is Str_Pt which is a variable of pointer type. This Str_Pt POINTS to StrArray. The Use of the ^ shows it where its pointing to. Thus an arrow..pointer..get it? 3. When you compile this it saves and goes down to 694 bytes of data space a BIG difference. 4. A new command New(Str_Pt); Is a constructor in OOP programming. It Creates and reserves space for the pointer on the heap. 5. Same for Dispose at the bottom. This is a Destructor in OOP jargon and clears the reservation of that spot so other programs can use that memory space. 6. Now to use the pointers: Str_Pt^[ICnt] := Chr(Random(65)+1); Writeln(Str_Pt^[Icnt]); The only difference here is we added a ^ to the end of the variable. This means we are Storing data using the pointer Str_PT. Then we read the same data using the ^ at the end as well meaning we are retrieving info from the pointer. It may be confusing as to where to put the ^ at the end or start. Just remember for data access, writes, reads use it at the end. For making varibles use it at the start so its pointing to some variable. This is much clearer to read than it is in C/C++ language and if you get in in pascal it helps alot. So what does the above really do? Well it frees up that huge chunk of ACTIVE memory to be stored Dynamically. This means the memory for the data is stored in Ram be it EMS, XMS or the space between the 64k limit and 1 meg of memory some old computers had :) This is houw the 64k memory barrier is broken. But this doesn't mean you have infinite space for data. It just meams you can store as much data as you have in memory. Thus a good system with 256 Megs of Ram could store a great, great deal of data. But the larger you get the more management you have to do on the data. Management of the data is done through commands like GetMem (a popular command used in simple graphics like PutImage for example) which simply gets the amount of space needed for some data object. FreeMem, AllocMem and other Heap commands also become critical for large programs. Pointers also speed up processing since its in memory rather than on a physical data space which may take time. This is another advantage of pointers. The Heap is basically that area of memory that is used by programs to Stack data (thus the Stack Size you see in your compile screens). Each function or procedure you do has a limited Stack space of data they can substore data in. But all this can be managed via pascal commands or the IDE itself. You can set lower or max heap and stack sizes to use. It is CRITICAL that you use a 1:1 association of New/Dispose. If you have 8 Pointers you should have 8 News and 8 Disposes. If not this will cause memory leaks. Thus when you exit your program the data of the pointer will still be reserved and not released so new programs you run can't use it. This we have all seen sometimes through the evil Windows Blue screen of death in some errors. Does this help or confuse folks? I could explain more if needed. Gotta run for now.. --- Fringe BBS * Origin: EWOG II - The Fringe - 904-733-1721 (1:112/91) .