[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