Let say I have stored a set of data in a field of a record. Now I want to use these data in a procedure which will calculate the difference between two adjacent elements. How can I create such a procedure?
Who is Participating?
ZifNabConnect With a Mentor Commented:
? liau, can you be more specific, are you working with database or did you made a plain pascal record?

My guess is your working with a database.

If with database, just make a calculated field. In the OnCalc procedure of the table, just fill in the calculation you want to make of the two fields, like

procedure TForm1.Table1CalcFields(DataSet: TDataSet);
 DataSet.NewCalcField := DataSet.Field1-DataSet.Field2;

Or you can go to SQL and use SQL commands to get the difference.

Regards, Zif.
mmm, reading your title again, this can't be a database question...

Just a pointer question?

Assume this :

  PMyData = ^TMyData;
  TMyData = record
   Value1 : integer;
   Value2 : integer;

var Pointer1, Pointer2 : PMyData

function difference(apointer1, apointer2: PMyData):interger;
 result := apointer1^.value1 - apointer2^.value1;

{fill records}

 Pointer1^.value1 := 30;
 Pointer1^.value2 := 40;

 Pointer2^.value1 := 10;
 Pointer2^.value2 := 20;

{function call}

 Mydifference := difference(pointer1,pointer2);

Euhm, let's assume that the syntax is correct (test it please, haven't done it myself, it's getting kinda late here), because it's a long time ago that I've used these things.

liau080698Author Commented:
The data has been read from a text file and stored in a plain pascal record called data with 2 fields namely dat and next. What I actually did was the following:

TopPointer := Nil;
While not Eof(f1) do
Readln(f1, Element);
Push(TopPointer, Element)

Procedure Push(var TopPointer : ^Data; Element : real);
TempPointer := ^Data;

  TempPointer^.dat := Element;
  TempPointer^.Next := TopPointer;
  TopPointer := TempPointer;

Now I require a procedure that could calculate the difference of all the adjacent data I have stored. If the data is stored in an array, I could create a loop within the procedure to do such a job since the array element has been numbered. How does one do a similar job if only the pointer of the record is passed into the procedure?

Hi liau,

Ok, I understand now :

Mostly we do it this way :

1. Store a the top of the stack into a variable :  eg. PStackTop
    PStackTop.Next := NIL;
2. POldRecord := PStackTop
2. If you add a record : eg NewRecord
    NewRecord.Next := NIL;
    OldRecord.Next := NewRecord;

Now to iterate through the list, just do

 PiterateRecord := PStackRecord
 while PiterateRecord.Next <> NIL then do begin
   PiterateRecord := PiterateRecord.next;

You see, the NIL is very important here, because it determines the end of the list....

What you also can do, but not so 'good' is to keep a pointer which addresses to the begin in the list, but also a pointer which addresses to the end of the list...

This way you iterate from beginpointer till you arrive on endpointer. But you should better use the method with nil.

PS. you can also add a .previous field... that way you can iterate both ways...

Regards, Zif.

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.