Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / fpc-pascal / 2020-09

Help with TList example

7 messages · 4 people ·

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

James Richters

I'm trying to figure out how TList works. I found the code example below by doing a search, but I can't compile it, I get Error: Illegal qualifier on the line

    MyRec.Value := tmp;
  It's indicating the error is on the V of Value

I tried commenting that line out, then I get the same error on

    MyRec.AByte := Byte(tmp);

At the A of AByte

So I commented that out too and then I get the error on

   Writeln('Value: ', MyRecList[tmp].Value, ' AByte: ', MyRecList[tmp].AByte);
At the V on Value after MyRecList[tmp].

I don't know enough about the syntax to figure out what's wrong here. Does anyone have any ideas? It seems like there is something fundamentally wrong.

I'm trying to make a temporary list of records. Kind of like a TStringList, but instead of a list of strings, a list of my own custom records. Perhaps there is a better way?

program Project1;
{$mode objfpc}{$H+}
uses
  SysUtils, Classes;
type
  PMyRec=^TMyRec;
  TMyRec=record
    Value: Integer;
    AByte: Byte;
  end;
  TMyRecList=class(TList)
  private
    function Get(Index: Integer): PMyRec;
  public
    destructor Destroy; override;
    function Add(Value: PMyRec): Integer;
    property Items[Index: Integer]: PMyRec read Get; default;
  end;

{ TMyRecList }

function TMyRecList.Add(Value: PMyRec): Integer;
begin
  Result := inherited Add(Value);
end;
destructor TMyRecList.Destroy;
var
  i: Integer;
begin
  for i := 0 to Count - 1 do
    FreeMem(Items[i]);
  inherited;
end;
function TMyRecList.Get(Index: Integer): PMyRec;
begin
  Result := PMyRec(inherited Get(Index));
end;
var
  MyRecList: TMyRecList;
  MyRec: pMyRec;
  tmp: Integer;
begin
  MyRecList := TMyRecList.Create;
  for tmp := 0 to 9 do
  begin
    GetMem(MyRec, SizeOf(TMyRec));
    MyRec.Value := tmp;
    MyRec.AByte := Byte(tmp);
    MyRecList.Add(MyRec);
  end;
  for tmp := 0 to MyRecList.Count - 1 do
    Writeln('Value: ', MyRecList[tmp].Value, ' AByte: ', MyRecList[tmp].AByte);
  WriteLn('  Press Enter to free the list');
  ReadLn;
  MyRecList.Free;
end.

James

Tony Whyman
to James Richters

Two observations:

1. In Pascal you should use "new" and "dispose" to allocate and deallocate record types - not GetMem and FreeMem.

2. MyRec is a pointer type and you should code the line as

MyRec^.Value := tmp
James Richters wrote 88 lines
I'm trying to figure out how TList works. I found the code example below by doing a search, but I can't compile it, I get Error: Illegal qualifier on the line MyRec.Value := tmp; It's indicating the error is on the V of Value I tried commenting that line out, then I get the same error on MyRec.AByte := Byte(tmp); At the A of AByte So I commented that out too and then I get the error on Writeln('Value: ', MyRecList[tmp].Value, ' AByte: ', MyRecList[tmp].AByte); At the V on Value after MyRecList[tmp]. I don't know enough about the syntax to figure out what's wrong here. Does anyone have any ideas? It seems like there is something fundamentally wrong. I'm trying to make a temporary list of records. Kind of like a TStringList, but instead of a list of strings, a list of my own custom records. Perhaps there is a better way? program Project1; {$mode objfpc}{$H+} uses SysUtils, Classes; type PMyRec=^TMyRec; TMyRec=record Value: Integer; AByte: Byte; end; TMyRecList=class(TList) private function Get(Index: Integer): PMyRec; public destructor Destroy; override; function Add(Value: PMyRec): Integer; property Items[Index: Integer]: PMyRec read Get; default; end; { TMyRecList } function TMyRecList.Add(Value: PMyRec): Integer; begin Result := inherited Add(Value); end; destructor TMyRecList.Destroy; var i: Integer; begin for i := 0 to Count - 1 do FreeMem(Items[i]); inherited; end; function TMyRecList.Get(Index: Integer): PMyRec; begin Result := PMyRec(inherited Get(Index)); end; var MyRecList: TMyRecList; MyRec: pMyRec; tmp: Integer; begin MyRecList := TMyRecList.Create; for tmp := 0 to 9 do begin GetMem(MyRec, SizeOf(TMyRec)); MyRec.Value := tmp; MyRec.AByte := Byte(tmp); MyRecList.Add(MyRec); end; for tmp := 0 to MyRecList.Count - 1 do Writeln('Value: ', MyRecList[tmp].Value, ' AByte: ', MyRecList[tmp].AByte); WriteLn(' Press Enter to free the list'); ReadLn; MyRecList.Free; end. James _______________________________________________ fpc-pascal maillist - https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
James Richters
to Tony Whyman

Can you please give me an example of the correct way to use new and dispose?

I'll try the pointer

Thanks for the advice

James

Earlier message 102 lines
-----Original Message----- From: fpc-pascal On Behalf Of Tony Whyman via fpc-pascal Sent: Tuesday, September 8, 2020 7:21 AM To: Cc: Tony Whyman Subject: Re: [fpc-pascal] Help with TList example Two observations: 1. In Pascal you should use "new" and "dispose" to allocate and deallocate record types - not GetMem and FreeMem. 2. MyRec is a pointer type and you should code the line as MyRec^.Value := tmp On 08/09/2020 12:10, James Richters via fpc-pascal wrote: > I'm trying to figure out how TList works. I found the code example below by doing a search, but I can't compile it, I get Error: Illegal qualifier on the line > MyRec.Value := tmp; > It's indicating the error is on the V of Value > > I tried commenting that line out, then I get the same error on > MyRec.AByte := Byte(tmp); > At the A of AByte > > So I commented that out too and then I get the error on > > Writeln('Value: ', MyRecList[tmp].Value, ' AByte: ', > MyRecList[tmp].AByte); At the V on Value after MyRecList[tmp]. > > I don't know enough about the syntax to figure out what's wrong here. Does anyone have any ideas? It seems like there is something fundamentally wrong. > > I'm trying to make a temporary list of records. Kind of like a TStringList, but instead of a list of strings, a list of my own custom records. Perhaps there is a better way? > > > program Project1; > {$mode objfpc}{$H+} > > uses > SysUtils, Classes; > > type > PMyRec=^TMyRec; > TMyRec=record > Value: Integer; > AByte: Byte; > end; > > TMyRecList=class(TList) > private > function Get(Index: Integer): PMyRec; > public > destructor Destroy; override; > function Add(Value: PMyRec): Integer; > property Items[Index: Integer]: PMyRec read Get; default; > end; > > { TMyRecList } > > function TMyRecList.Add(Value: PMyRec): Integer; begin > Result := inherited Add(Value); > end; > > destructor TMyRecList.Destroy; > var > i: Integer; > begin > for i := 0 to Count - 1 do > FreeMem(Items[i]); > inherited; > end; > > function TMyRecList.Get(Index: Integer): PMyRec; begin > Result := PMyRec(inherited Get(Index)); end; > > var > MyRecList: TMyRecList; > MyRec: pMyRec; > tmp: Integer; > begin > MyRecList := TMyRecList.Create; > for tmp := 0 to 9 do > begin > GetMem(MyRec, SizeOf(TMyRec)); > MyRec.Value := tmp; > MyRec.AByte := Byte(tmp); > MyRecList.Add(MyRec); > end; > > for tmp := 0 to MyRecList.Count - 1 do > Writeln('Value: ', MyRecList[tmp].Value, ' AByte: ', MyRecList[tmp].AByte); > WriteLn(' Press Enter to free the list'); > ReadLn; > MyRecList.Free; > end. > > James > > _______________________________________________ > fpc-pascal maillist - > https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal >
Tony Whyman
to James Richters

See https://www.freepascal.org/docs-html/rtl/system/dispose.html

James Richters wrote 114 lines
Can you please give me an example of the correct way to use new and dispose? I'll try the pointer Thanks for the advice James -----Original Message----- From: fpc-pascal On Behalf Of Tony Whyman via fpc-pascal Sent: Tuesday, September 8, 2020 7:21 AM To: Cc: Tony Whyman Subject: Re: [fpc-pascal] Help with TList example Two observations: 1. In Pascal you should use "new" and "dispose" to allocate and deallocate record types - not GetMem and FreeMem. 2. MyRec is a pointer type and you should code the line as MyRec^.Value := tmp On 08/09/2020 12:10, James Richters via fpc-pascal wrote: > I'm trying to figure out how TList works. I found the code example below by doing a search, but I can't compile it, I get Error: Illegal qualifier on the line > MyRec.Value := tmp; > It's indicating the error is on the V of Value > > I tried commenting that line out, then I get the same error on > MyRec.AByte := Byte(tmp); > At the A of AByte > > So I commented that out too and then I get the error on > > Writeln('Value: ', MyRecList[tmp].Value, ' AByte: ', > MyRecList[tmp].AByte); At the V on Value after MyRecList[tmp]. > > I don't know enough about the syntax to figure out what's wrong here. Does anyone have any ideas? It seems like there is something fundamentally wrong. > > I'm trying to make a temporary list of records. Kind of like a TStringList, but instead of a list of strings, a list of my own custom records. Perhaps there is a better way? > > > program Project1; > {$mode objfpc}{$H+} > > uses > SysUtils, Classes; > > type > PMyRec=^TMyRec; > TMyRec=record > Value: Integer; > AByte: Byte; > end; > > TMyRecList=class(TList) > private > function Get(Index: Integer): PMyRec; > public > destructor Destroy; override; > function Add(Value: PMyRec): Integer; > property Items[Index: Integer]: PMyRec read Get; default; > end; > > { TMyRecList } > > function TMyRecList.Add(Value: PMyRec): Integer; begin > Result := inherited Add(Value); > end; > > destructor TMyRecList.Destroy; > var > i: Integer; > begin > for i := 0 to Count - 1 do > FreeMem(Items[i]); > inherited; > end; > > function TMyRecList.Get(Index: Integer): PMyRec; begin > Result := PMyRec(inherited Get(Index)); end; > > var > MyRecList: TMyRecList; > MyRec: pMyRec; > tmp: Integer; > begin > MyRecList := TMyRecList.Create; > for tmp := 0 to 9 do > begin > GetMem(MyRec, SizeOf(TMyRec)); > MyRec.Value := tmp; > MyRec.AByte := Byte(tmp); > MyRecList.Add(MyRec); > end; > > for tmp := 0 to MyRecList.Count - 1 do > Writeln('Value: ', MyRecList[tmp].Value, ' AByte: ', MyRecList[tmp].AByte); > WriteLn(' Press Enter to free the list'); > ReadLn; > MyRecList.Free; > end. > > James > > _______________________________________________ > fpc-pascal maillist - > https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal > _______________________________________________ fpc-pascal maillist - https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
Jean SUZINEAU
to James Richters: I'm trying to figure out how TList works. I found the code example below by doing a…

Another way is to declare TMyRec as class instead of record.

In this case, you don't need the  dereference operator ^ .

No need of new and dispose, just Create and Free, as for TMyRecList.

I don't know if there is a better performance when you use a record, but as far as I know, record/object/new/dispose is just the old syntax for the first object oriented programming born with Turbo Pascal 5.5 around 1989.

The new syntax with class / constructor Create / destructor Free is born Delphi 1 around 1995.

Below is your code modified with TMyRec=class

==========================

program Project1;
{$mode objfpc}{$H+}
uses
   SysUtils, Classes;
type
   TMyRec=class
     Value: Integer;
     AByte: Byte;
   end;
   TMyRecList=class(TList)
   private
     function Get(Index: Integer): TMyRec;
   public
     destructor Destroy; override;
     function Add(Value: TMyRec): Integer;
     property Items[Index: Integer]: TMyRec read Get; default;
   end;

{ TMyRecList }

function TMyRecList.Add(Value: TMyRec): Integer;
begin
   Result := inherited Add(Value);
end;
destructor TMyRecList.Destroy;
var
   i: Integer;
begin
   for i := 0 to Count - 1 do
     Items[i].Free;
   inherited;
end;
function TMyRecList.Get(Index: Integer): TMyRec;
begin
   Result := TMyRec(inherited Get(Index));
end;
var
   MyRecList: TMyRecList;
   MyRec: TMyRec;
   tmp: Integer;
begin
   MyRecList := TMyRecList.Create;
   for tmp := 0 to 9 do
   begin
     MyRec:= TMyRec.Create;
     MyRec.Value := tmp;
     MyRec.AByte := Byte(tmp);
     MyRecList.Add(MyRec);
   end;
   for tmp := 0 to MyRecList.Count - 1 do
     Writeln('Value: ', MyRecList[tmp].Value, ' AByte: ',
MyRecList[tmp].AByte);
   WriteLn('  Press Enter to free the list');
   ReadLn;
   MyRecList.Free;
end.
Ryan Joseph
to James Richters: I'm trying to figure out how TList works. I found the code example below by doing a…
On Sep 8, 2020, at 6:10 PM, James Richters via fpc-pascal wrote: I'm trying to figure out how TList works. I found the code example below by doing a search, but I can't compile it, I get Error: Illegal qualifier on the line

Do you want an array of pointers (objects allocated on the stack) or an array of records (i.e. one continuous block of memory? I you want an array of pointers try using classes as mentioned or if you want an array of records try TFPGList and specialize for your record type.

Regards,
Ryan Joseph

James Richters
to Jean SUZINEAU: Another way is to declare TMyRec as class instead of record. In this case, you don't need…

Thank you for the help, I'll give it a try!

James

Earlier message 81 lines
-----Original Message----- From: fpc-pascal On Behalf Of Jean SUZINEAU via fpc-pascal Sent: Tuesday, September 8, 2020 8:47 AM To: Cc: Jean SUZINEAU Subject: Re: [fpc-pascal] Help with TList example Another way is to declare TMyRec as class instead of record. In this case, you don't need the dereference operator ^ . No need of new and dispose, just Create and Free, as for TMyRecList. I don't know if there is a better performance when you use a record, but as far as I know, record/object/new/dispose is just the old syntax for the first object oriented programming born with Turbo Pascal 5.5 around 1989. The new syntax with class / constructor Create / destructor Free is born Delphi 1 around 1995. Below is your code modified with TMyRec=class ========================== program Project1; {$mode objfpc}{$H+} uses SysUtils, Classes; type TMyRec=class Value: Integer; AByte: Byte; end; TMyRecList=class(TList) private function Get(Index: Integer): TMyRec; public destructor Destroy; override; function Add(Value: TMyRec): Integer; property Items[Index: Integer]: TMyRec read Get; default; end; { TMyRecList } function TMyRecList.Add(Value: TMyRec): Integer; begin Result := inherited Add(Value); end; destructor TMyRecList.Destroy; var i: Integer; begin for i := 0 to Count - 1 do Items[i].Free; inherited; end; function TMyRecList.Get(Index: Integer): TMyRec; begin Result := TMyRec(inherited Get(Index)); end; var MyRecList: TMyRecList; MyRec: TMyRec; tmp: Integer; begin MyRecList := TMyRecList.Create; for tmp := 0 to 9 do begin MyRec:= TMyRec.Create; MyRec.Value := tmp; MyRec.AByte := Byte(tmp); MyRecList.Add(MyRec); end; for tmp := 0 to MyRecList.Count - 1 do Writeln('Value: ', MyRecList[tmp].Value, ' AByte: ', MyRecList[tmp].AByte); WriteLn(' Press Enter to free the list'); ReadLn; MyRecList.Free; end.