Ivars Braze
Ivars Braze

Reputation: 1

Pascal. Specify to use a variable instead of function with the same name>

I'm writing long digit arythmetics. This is a function for adding to longint long binary digits. I need to output the sum inside the function, to debug it. How could I do it, without creating new variables?

function add(var s1,s2:bindata;shift:longint):bindata;
var l,i:longint;
    o:boolean;
begin
    writeln(s1.len,' - ',s2.len);
    o:=false;
    l:=max(s1.len,s2.len);
    add.len:=0;
    for i:=1 to l do begin
        if o then Begin
            if s1.data[i+shift] then Begin
                if (s2.data[i]) then add.data[i+shift]:=true
                Else add.data[i+shift]:=false;
            End
            else if s2.data[i] then add.data[i+shift]:=false
            else Begin
                add.data[i+shift]:=true;
                o:=false;
            End;
        End
        Else Begin
            if s1.data[i+shift] then Begin
                if s2.data[i] then 
                Begin
                    add.data[i+shift]:=false;
                    o:=true;
                End
                Else add.data[i+shift]:=true;
            End
            else if s2.data[i] then add.data[i+shift]:=true
            else add.data[i+shift]:=false;
        End;
        output(add);  //Can I output a variable?
    end;
    add.len:=l;
    if o then Begin
        inc(add.len);
        add.data[add.len]:=true;
    End;
end;

Upvotes: 0

Views: 135

Answers (1)

Rob Kennedy
Rob Kennedy

Reputation: 163247

You are accumulating the result of the function within the function result variable, which is generally fine, but uses an outdated style, and leads to exactly the problem you're facing here. You're trying to report an intermediate value of the function result, and to do that, you're trying to reference the name of the function, add. When you do that, though, the compiler interprets it as an attempt to report the function itself, rather than the expected return value of this particular invocation of the function. You'll get the address of the function, if output is defined to accept function addresses; otherwise, you'll get a compiler error.

If your compiler offers a certain common language extension, then you should use the implicit Result variable to refer to the intermediate return value instead of continuing to refer to it by the function name. Since Result is declared implicitly, you wouldn't have to create any other variables. The compiler automatically recognizes Result and uses it as an alias for the function's return value. Simply find every place you write add within the function and replace it with Result. For example:

if o then begin
  Inc(Result.len);
  Result.data[Result.len] := True;
end;

Turbo Pascal, Free Pascal, GNU Pascal, and Delphi all support the implicit Result variable, but if you've managed to get stuck with a compiler that doesn't offer that extension, then you have no choice but to declare another variable. You could name it Result, and then implement your function with one additional line at the end, like so:

function add(var s1, s2: bindata; shift: longint): bindata;
var
  l, i: longint;
  o: boolean;
  Result: bindata;
begin
  {
    Previous function body goes here, but with
    `add` replaced by `Result`
  }
  { Finally, append this line to copy Result into the
    function's return value immediately before returning. }
  add := Result;
end;

Upvotes: 1

Related Questions