0

私は長桁の算術を書いています。longint long 2 進数に加算する関数です。デバッグするには、関数内の合計を出力する必要があります。新しい変数を作成せずに、どうすればそれを行うことができますか?

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;

4

1 に答える 1

1

関数の結果変数内に関数の結果を蓄積しています。これは一般的には問題ありませんが、時代遅れのスタイルを使用しており、ここで直面している問題を正確に引き起こします。関数の結果の中間値を報告しようとしています。そのために、関数の名前を参照しようとしていますadd。ただし、これを行うと、コンパイラはそれを、関数のこの特定の呼び出しの期待される戻り値ではなく、関数自体を報告しようとしていると解釈します。outputが関数アドレスを受け入れるように定義されている場合、関数のアドレスを取得します。そうしないと、コンパイラ エラーが発生します。

コンパイラが特定の共通言語拡張機能を提供している場合は、暗黙的Resultな変数を使用して、関数名で参照し続けるのではなく、中間の戻り値を参照する必要があります。Resultは暗黙的に宣言されているため、他の変数を作成する必要はありません。コンパイラはこれを自動的に認識し、関数の戻り値のエイリアスResultとして使用します。関数内で記述したすべての場所を見つけて、 に置き換えるだけです。例えば:addResult

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

Turbo Pascal、Free Pascal、GNU Pascal、および Delphi はすべて暗黙の変数をサポートしていますが、その拡張機能を提供しないResultコンパイラで行き詰まってしまった場合は、別の変数を宣言するしかありません。という名前を付けて、次のように、最後に 1 行追加して関数を実装できます。Result

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;
于 2013-12-17T17:39:04.467 に答える