


                                                        Chapter 9
                                                          RECORDS


A VERY SIMPLE RECORD
_________________________________________________________________

We come to the grandaddy of all data structures  ================
in Pascal, the record.  A record is composed of    SMALLREC.PAS
a number of variables any of which can be of any ================
predefined data type, including other records. 
Rather than spend time trying to define a record
in detail, lets go right to the first example program,
SMALLREC.PAS.  This is a program using nonsense data that will
illustrate the use of a record.

There is only one entry in the type declaration part of the
program, the record identified by the name Description.  The record
is composed of three fields, the Year, Model, and Engine variables. 
Notice that the three fields are each of a different type,
indicating that the record can be of mixed types.  You have a
complete example of the way a record is defined before you.  It is
composed of the identifier Description, the = sign, the reserved
word record, the list of elements, and followed by the reserved
word end.  This is one of the places in Pascal where an end is used
without a corresponding begin.  Notice that this only defines a
type, it does not define any variables.  That is done in the var
declaration where the variable Truck is defined as a record of type
Description and Cars is defined to have 10 complete records of the
type Description.  The variable Truck has three components, Year,
Model, and Engine, and any or all of these components can be used
to store data pertaining to Truck.

When assigning data to the variable Truck, for example, there are
actually three parts to the variable, so we use three assignment
statements, one for each of the sub-fields.  In order to assign
values to the various sub-fields, the variable name is followed by
the sub-field name with a separating period.  The "var.sub_field"
combination is a variable name.

Keep in mind that Truck is a complete record containing three
variables, and to assign or use one of the variables, you must
designate which sub-field you are interested in.  Examine lines 16
through 18 of the program where the three fields are assigned
meaningless data for illustration.  The Year field is assigned an
integer number, the Model field is assigned the name Pickup, and
the Engine variable is assigned the value Diesel.

A loop is then used to assign data to all 10 records of Cars.  In
order to further illustrate that there are actually 30 variables
in use here, a few are changed at random in lines 26 through 30,
being very careful to maintain the required types as defined in the
type declaration part of the program.  Finally, all ten composite

                                                         Page 9-1

                                              Chapter 9 - Records

variables, consisting of 30 actual variables in a logical grouping
are printed out using the same "var.sub-field" notation described
above.

If the preceding description of a record is not clear in your mind,
review it very carefully.  It's a very important concept in Pascal,
and you won't have a hope of a chance of understanding the next
example until this one is clear.  Be sure to compile and run
SMALLREC.PAS so you can study the output.


A SUPER RECORD
_________________________________________________________________

Examine the Pascal example file BIGREC.PAS for   ================
a very interesting record.  First we have a         BIGREC.PAS
constant defined.  Ignore it for the moment, we  ================
will come back to it later.  Within the type
declaration we have three records defined, and
upon close examination, you will notice that the first two records
are included as part of the definition of the third record.  The
record identified as Person, actually contains 9 variable
definitions, three within the Full_Name record, three of its own,
and three within the Date record.  Once again, this is a type
declaration and does not actually define any variables, that is
done in the var part of the program.

The var part of the program defines some variables beginning with
the array of Friend containing 50 (because of the constant
definition in the const part) records of the user defined type,
Person.  Since the type Person defines 9 fields, we have now
defined 9 times 50 = 450 separate and distinct variables, each with
its own defined type.  Remember that Pascal is picky about
assigning data by the correct type.  Each of the 450 separate
variables has its own type associated with it, and the compiler
will generate an error if you try to assign any of those variables
the wrong type of data.  Since Person is a type definition, it can
be used to define more than one variable, and in fact it is used
again to define three more records, Self, Mother, and Father. 
These three records are each composed of 9 variables, so we have
27 more variables which we can manipulate within the program. 
Finally we have the variable Index defined as a simple byte type
variable.


HOW TO MANIPULATE ALL OF THAT DATA
_________________________________________________________________

In the program we begin by assigning data to all of the fields of
Self in lines 31 through 43.  Examining the first three statements
of the main program, we see the construction we learned in the last
example program being used, namely the period between descriptor
fields.  The main record is named Self, and we are interested in
the first part of it, specifically the Name part of the Person

                                                         Page 9-2

                                              Chapter 9 - Records

record.  Since the Name part of the Person record is itself
composed of three parts, we must designate which component of it
we are interested in.  Self.Name.First_Name is the complete
description of the first name of Self and is used in the assignment
statement in line 31 where it is assigned the name of "Charley". 
The next two fields are handled in the same way and are self
explanatory.


WHAT IS THE WITH STATEMENT?
_________________________________________________________________

Continuing on to the fourth field, the City, there are only two
levels required because City is not another record definition.  The
fourth field is therefore completely defined by Self.City.  Notice
the with Self do statement.  This is a shorthand notation used with
record definitions to simplify coding.  From the begin in line 34
to the matching end in line 43, any variables within the Self
record are used as though they had a Self. in front of them.  It
greatly simplifies coding to be able to omit the leading identifier
within the with section of code.  You will see that City, State,
and Zipcode are easily assigned values without further reference
to the Self variable.  When we get to the Day part of the birthday,
we are back to three levels and the complete definition is
Self.Birthday.Day but once again, the Self. part is taken care of
automatically because we are still within the with Self do area.

To illustrate the with statement further, another is introduced in
line 39, with Birthday do, and an area is defined by the begin end
pair which extends from line 39 through line 42.  Within this area
both leading identifiers are handled automatically to simplify
coding, and Month is equivalent to writing Self.Birthday.Month if
both with statements were removed.  


HOW FAR DOWN CAN YOU NEST THE WITH STATEMENT?
_________________________________________________________________

You may be wondering how many levels of nesting are allowed in
record definitions.  There doesn't appear to be a limit according
to the Pascal definition, but we do get a hint at how far it is
possible to go.  In TURBO Pascal, you are allowed to have with
statements nested to nine levels, and it would be worthless to nest
with statements deeper than the level of records.  Any program
requiring more levels than nine is probably far beyond the scope
of your programming ability, and mine, for a long time.

After assigning a value to Year, the entire record of Self is
defined, all nine variables.  It should be pointed out that even
though Self is composed of nine separate variables, it is proper
to call Self a variable itself because it is a record variable.




                                                         Page 9-3

                                              Chapter 9 - Records

SUPER-ASSIGNMENT STATEMENTS
_________________________________________________________________

The statement in line 45, "Mother := Self;" is very interesting. 
Since both of these are records, both are the same type of record,
and both therefore contain 9 variables, Pascal is smart enough to
recognize that, and assign all nine values contained in Self to the
corresponding variables of Mother.  So after one statement, the
record variable Mother is completely defined.  The statement in
line 46 assigns the same values to the nine respective variables
of Father, and the next two lines assign all 50 Friend variables
the same data.  By this point in the program, we have therefore
generated 450 + 27 = 477 separate pieces of data so far in this
program.  We could print it all out, but since it is nonsense data,
it would only waste time and paper.  Lines 49 through 52 write out
three sample pieces of the data for your inspection.



WHAT GOOD IS ALL OF THIS
_________________________________________________________________

It should be obvious to you that what this program does, even
though the data is nonsense, appears to be the beginning of a
database management system, which indeed it is.  Instead of
assigning nonsense data, a list could be read in and stored for
manipulation.  It is a crude beginning, and has a long way to go
to be useful, but you should see a seed for a useful program.

Now to go back to the const in line 4 as promised.  The number of
friends was defined as 50 and used for the size of the array and
in the assignment loop in line 47.  You can now edit this number
and see how big this database can become on your computer.  If you
are using TURBO Pascal, you will be limited to slightly more than
1000 because of the 64K limitation of an executable program, and
the fact that all of this data is stored within that 64K boundary. 
It should be noted that TURBO Pascal allows a program larger than
64K but still places a limitation of 64K on each compilation unit. 
See how big you can make the number of friends before you get the
memory overflow message.  Keep the number in mind because when we
get to the chapter on Pointers and Dynamic Allocation, you will see
a marked increase in allowable size, especially if you have a large
amount of RAM installed in your computer.



A VARIANT RECORD
_________________________________________________________________

If any part of this chapter is still unclear, it would be good for
you to go back and review it at this time.  The next example will
really tax your mind to completely understand it, and this will be
true especially if the prior material is not clear.


                                                         Page 9-4

                                              Chapter 9 - Records

Examine the Pascal program VARREC.PAS for an     ================
example of a program with a variant record          VARREC.PAS
definition.  In this example, we first define a  ================
scalar type, namely Kind_Of_Vehicle for use
within the record.  Then we have a record
defining Vehicle, intended to define several different vehicles,
each with different kinds of data.  It would be possible to define
all variables for all types of vehicles, but it would be a waste
of storage space to define the number of tires for a boat, or the
number of propeller blades used on a car or truck.  The variant
record lets us define the data precisely for each vehicle without
wasting data storage space.



WHAT IS A TAG-FIELD?
_________________________________________________________________

In the record definition we have the usual record header followed
by three variables defined in the same manner as the records in the
last two example programs.  Then we come to the case statement. 
Following this statement, the record is different for each of the
four types defined in the associated scalar definition.  The
variable What_Kind is called the tag-field and must be defined as
a scalar type prior to the record definition.  The tag-field is
used to select the variant, when the program uses one of the
variables of this record type.  The tag-field is followed by a
colon and its type definition, then the reserved word of.  A list
of the variants is then given, with each of the variants having the
variables for its particular case defined.  The list of variables
for one variant is called the field list.

A few rules are in order at this point.  The variants do not have
to have the same number of variables in each field list, and in
fact, one or more of the variants may have no variables at all in
its variant part.  If a variant has no variables, it must still be
defined with a pair of empty parentheses followed by a semi-colon. 
All variables in the entire variant part must have unique names. 
The three variables, Wheels, Tires, and Tyres, all mean the same
thing to the user, but they must be different for the compiler. 
You may use the same identifiers again in other records and for
simple variables anywhere else in the program.  The Pascal compiler
can tell which variable you mean by its context.  Using the same
variable name should be discouraged as bad programming practice
because it may confuse you or another person trying to understand
your program at a later date.  

The final rule is that the variant part of the record must be the
last part of it, and in fact, the last part of any or all variants
can itself have a variant part to it.  That is getting pretty
advanced for our level of use of Pascal at this time however.




                                                         Page 9-5

                                              Chapter 9 - Records

USING THE VARIANT RECORD
_________________________________________________________________

We properly define four variables with the record type Vehicle in
line 22 and go on to examine the program itself.

We begin by defining one of our variables of type Vehicle, namely
the variable named Ford.  The seven lines assigning values to Ford
are similar to the prior examples with the exception of line 28. 
In that line the tag-field which selects the particular variant
used is set equal to the value Truck, which is a scalar definition,
not a variable.  This means that the variables named Motor, Tires,
and Payload are available for use with the record Ford, but the
variables named Wheels, Engine, Tyres, etc. are not available in
the record named Ford.

Next, we will define the record Sunfish as a Boat, and define all
of its variables in lines 33 through 41.  All of Sunfish's
variables are defined but in a rather random order to illustrate
that they need not be defined in a particular order.  You should
remember the with statement from the last example program.

To go even further in randomly assigning the variables to a record,
we redefine Ford as having an Engine which it can only have if it
is a car.  This is one of the fine points of the Pascal record. 
If you assign any of the variant variables, the record is changed
to that variant, but it is the programmers responsibility to assign
the correct tag-field to the record, not Pascal's.  Good
programming practice would be to assign the tag-field before
assigning any of the variant variables.  The remainder of the Ford
variables are assigned to complete that record, the non-variant
part remaining from the last assignment.

The variable Mac is now set equal to the variable Sunfish in line
48.  All variables within the record are copied to Mac including
the tag-field, making Mac a Boat.


NOW TO SEE WHAT WE HAVE IN THE RECORDS
_________________________________________________________________

We have assigned Ford to be a car, and two boats exist, namely
Sunfish and Mac.  Since Schwinn was never defined, it has no data
in it, and is at this point useless.  The Ford tag-field has been
defined as a car, so it should be true in the if statement, and the
message in line 51 should print.  The Sunfish is not a bicycle, so
it will not print.  The Mac has been defined as a boat in the
single assignment statement, so it will print a message with an
indication that all of the data in the record was transferred to
its variables.

Even though we can make assignment statements with records, they
cannot be used in any mathematical operations such as addition, or
multiplication.  They are simply used for data storage.  It is true

                                                         Page 9-6

                                              Chapter 9 - Records

however, that the individual elements in a record can be used in
any mathematical statements legal for their respective types.

One other point should be mentioned.  The tag-field can be
completely eliminated resulting in a "free union" variant record. 
This is possible because Pascal, as you may remember from above,
will automatically assign the variant required when you assign data
to one of the variables within a variant.  This is the reason that
all variables within any of the variants must have unique names. 
The free union record should be avoided in your early programming
efforts because you cannot test a record to see what variant has
been assigned to it.  It is definitely an advanced technique in
Pascal.

Be sure you compile and run VARREC.PAS and study the output until
you understand it completely.



PROGRAMMING EXERCISE
_________________________________________________________________

1.   Write a simple program with a record to store the names of
     five of your friends and display the names.































                                                         Page 9-7
