Am 18.11.2011 17:47, schrieb John Lee:
Sorry for confusion, my email wasn't clear...
old fpc version, that I have to use because of availability of various
units...Free Pascal Compiler version 2.2.2 [2008/08/03] for i386

this is jim.pp---
unit jim;
interface
  function fna:string;
  function fnb:string;

implementation
function fna:string;
begin
  fna:='jim';
end;
function fnb:string;
begin
  fnb:=fna;
end;
end.

this is fred.pp---
uses jim;

function fna:string;
begin
  fna:='fred';
end;

begin
  writeln(fnb);
end.

This writeln gives jim, ie the version in jim - I'd like it to be fred &
thought that it would! What can I do please, to _force_ fnb to use the
fred version of fna?

As I said per se this is expected, because the "jnb" in "jim" only knows about the "jna" in "jim", but not about the "jna" in your main program.

Possible solution:

Extend your unit "jim" the following way (this is the "function variable" approach I mentioned):

=== unit jim begin ===

unit jim;

interface

type
  TStringFunc = function: String;

function fna: String;
function fnb(aFunc: TStringFunc = Nil): String;

implementation

function fna: String;
begin
  fna := 'jim';
end;

function fnb(aFunc: TStringFunc): String;
begin
  if Assigned(aFunc) then
    fnb := aFunc
  else
    fnb := fna;
end;

end.

=== unit jim end ===

And your main program will then look like this:

=== main program begin ===

uses jim;

function fna: String;
begin
  fna := 'fred';
end;

begin
  writeln(fnb(@fna)); // will print "fred"
  writeln(fnb); // will print "jim"
end.

=== main program end ===

For further information about procedure/function variables I refer you to the documentation: http://www.freepascal.org/docs-html/ref/refse17.html#x45-520003.6

Of course you are free to ask further questions if you need help on this or another topic. ;)

Regards,
Sven
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to