[fpc-devel] Parameters must match exactly?

Michael Van Canneyt michael at freepascal.org
Mon May 17 10:43:51 CEST 2010

On Mon, 17 May 2010, Graeme Geldenhuys wrote:

> Michael Van Canneyt het geskryf:
>> You only need var/out when you want to change the instance pointer, i.e.
>> switch to another instance. And I count FreeAndNil() among this. (.Free
>> on the other hand is still possible, but not recommended).
>> If  you just want to set properties or call methods on an existing instance,
>> there is no need to use out or var.
> Thank you Michael, I understand it much better now. Could you please add
> this information into the FPC Language Reference document? I re-read
> Chapter 11 in ref.pdf and there is no mention of what you said, and the
> documentation doesn't cover what happens if a Class is passed as a
> parameter. It only mentions simple types and arrays as parameters. Maybe
> adding a extra section in that chapter explaining when to use what?

I will do that.

> This brings me to another question. What is supposed to happen if you pass
> a Class instance as a const parameter? Does that even make sense? If not,
> why does the compiler allow that? Again, the documentation doesn't cover
> this scenario. Same question applies to passing a record structure.
> eg:
> ----------------------------
> procedure ProcessPerson(const APerson: TPerson);
> begin
>  ...  // Am I allowed to change APerson.Name property?
>  ...  // Am I allowed to assign a new instance to APerson?
> end;
> ...
>  lPerson := TPerson.Create;
>  lPerson.Name := 'Graeme Geldenhuys';
>  ProcessPerson(lPerson);
> ----------------------------
> * I see I can't assign a new instance to APerson - this makes sense.
> * I can assign new values to APerson.Name - am I supposed to be
>  allowed to do that?

Yes. In the same way as when you have a const pointer to a array of char,
you can change the array's contents, but not the pointer.

const means: you cannot change the value of the passed parameter.

Const doesn't make a lot of sense for pointers, since, with some
imagination, passing a pointer is equivalent to a var parameter.
(see C and other such languages)


More information about the fpc-devel mailing list