//{$mode delphi}
{$mode objfpc}{$H+}
{$modeswitch ADVANCEDRECORDS}
Uses crt, sysUtils;
Type
TVehicleType = ( Car , Truck );
PCarParameters = ^TCarParameters;
TCarParameters = record
crew : Integer;
end;
PTruckParameters = ^TTruckParameters;
TTruckParameters = record
cargo : Integer;
trailer : Boolean;
end;
PVehicle = ^TVehicle;
TVehicle = record
carType : TVehicleType;
parameters : Pointer;
end;
TVehicleDatabase = record
list : Array [0..9] of TVehicle;
count : Integer;
procedure Init;
procedure AddVehicle(const _carType: TVehicleType; const _parameters: pointer); // GetMem
procedure WriteInfo(Index: Integer);
procedure Free;
end;
Var
DB : TVehicleDatabase;
procedure TVehicleDatabase.Init;
begin
count := 0;
end;
procedure TVehicleDatabase.AddVehicle( const _carType : TVehicleType; const _parameters : pointer );
var
pT : PTruckParameters;
begin
if count - 1 = high(list) then exit;
list[count].carType := _carType;
case list[count].carType of
// First option
car : begin
GetMem( list[count].Parameters, SizeOf(TCarParameters) );
FillChar(list[count].Parameters^, SizeOf(TCarParameters), 0);
TCarParameters( list[count].parameters^ ).crew := TCarParameters( _parameters^ ).crew;
end;
// Second option
truck : begin
GetMem( list[count].Parameters, SizeOf(TTruckParameters) );
FillChar(list[count].Parameters^, SizeOf(TTruckParameters), 0);
pT := list[count].parameters;
pT^.cargo := TTruckParameters( _parameters^ ).cargo;
pT^.trailer := TTruckParameters( _parameters^ ).trailer;
end;
end;
inc( count );
end;
procedure TVehicleDatabase.WriteInfo( Index : Integer );
begin
writeln( 'Vehicle[' + IntToStr( Index ) + '].CarType: ', ord( list[index].CarType ) );
case list[index].carType of
car : With TCarParameters( list[index].Parameters^ ) do
begin
Writeln( 'Vehicle[' + IntToStr( Index ) + '].crew: ', crew );
end;
truck : With TTruckParameters( list[index].Parameters^ ) do
begin
writeln( 'Vehicle[' + IntToStr( Index ) + '].cargo: ', cargo );
writeln( 'Vehicle[' + IntToStr( Index ) + '].trailer: ', trailer );
end;
end;
writeln( '--------------------------' );
writeln;
end;
procedure TVehicleDatabase.Free;
var
i : Integer;
begin
for i := 0 to count -1 do
freemem( list[i].parameters );
end;
var
car_params : TCarParameters;
truck_params : TTruckParameters;
i : Integer;
begin
DB.Init;
car_params.crew := 1;
DB.AddVehicle( car, @car_params );
car_params.crew := 4;
DB.AddVehicle( car, @car_params );
truck_params.cargo := 2000;
truck_params.trailer := true;
DB.AddVehicle( truck, @truck_params );
truck_params.cargo := 0;
truck_params.trailer := false;
DB.AddVehicle( truck, @truck_params );
for i := 0 to DB.count -1 do
DB.WriteInfo(i);
DB.Free;
readkey;
end.