[fpc-pascal] constant records as default parameters

Howard Page-Clark hdpc at talktalk.net
Fri Dec 31 00:28:58 CET 2010


On 30/12/10 7:40, David Emerson wrote:
> I'd like to use a constant record as a default parameter. Is there some way to
> do this? Here's my use case:
>
> type
>    lt_ints = record
>      left, top : longint;
>      end;
>
> const
>    lt_zero : lt_ints = (left:0; top:0);
>
> procedure do_something (const offset_lt : lt_ints = lt_zero);
>
>
> The procedure declaration gives an error ("illegal expression").
>
> I assume the trouble is that lt_zero cannot be used as a default parameter
> value, because it is not truly a constant: it is an initialized variable.
>
> Perhaps my real question is: how do I make a constant record which is truly
> constant, rather than an initialized variable?

AFAIK default parameters can only be simple types, not complex types 
like records. Although, I did get the following program using a default 
class parameter to compile and run. (And I thought you could not have 
var default parameters).

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
   Classes, Forms, Dialogs, StdCtrls;

type
   TForm1 = class(TForm)
     Button1: TButton;
     procedure Button1Click(Sender: TObject);
   end;

   Tduo = class
   public
     top, left: longint;
   end;

var  Form1: TForm1;

implementation

{$R *.lfm}

procedure TForm1.Button1Click(Sender: TObject);
var duo: Tduo=nil;

   procedure Doit(var du: TDuo = nil);
   begin
     if du = nil then
      begin
      du := TDuo.Create;
      du.top:=2;
      end;
   end;

begin
   Doit(duo);
   ShowMessageFmt('duo.top has value %d',[duo.top]);
   duo.Free;
end;

end.

Howard



More information about the fpc-pascal mailing list