0

単純な関数 (数値の場合は sqr) を使用したい

function stepenadr(adresss:pointer):real;
begin
stepenadr:=adresss^*adresss^;
end;

実数変数のアドレスを使用して

 adress:=@x1;

このような:

writeln(x1,'^',2,'=',stepenadr(adress));

ただし、この操作を実行できない、またはポインターの名前を変更できないなどのエラーが表示されます。住所は

adress :pointer;

このようにも機能しません:

function stepenadr(adresss:pointer):real;
begin
stepenadr:=adresss*adresss;
end;
4

2 に答える 2

3

型指定されていないポインターは、次のプログラムを実行することで確認できる匿名の空のレコードを指します。

var p  :pointer;
begin
  writeln (sizeof(p^)); // will print 0
end.

型指定されていないポインターには、任意の情報を受け入れるという利点がありますが、型指定されていない関数への型指定されたポインターの割り当て中に、ポインターが指すものへの info(type) が失われます。あなたが知ったように。

解決策は、タイプされたままにするか、まれにタイプキャストすることです。

type preal=^real;

function stepenadr(adresss:pointer):real;
begin
  stepenadr:=preal(adresss)^*preal(adresss)^;
end;

これにより、ポインターを (preal として) 解釈する方法がコンパイラーに説明され、ポインターが指す型が再度定義されます。

ただし、アドレスが最初に実数を指していなかった場合、コンパイラがランダムメモリを実数として解釈する可能性があるため、これは壊滅的に間違った方向に進む可能性があります。

于 2013-05-23T17:23:05.807 に答える
0

気にしないで、これを行うことで動作するようになりました:

function stepenadr(adress:^real):real;
begin
stepenadr:=adress^*adress^;
end;

adress:=@x1;
writeln(x1,'^',2,'=',stepenadr(adress));
于 2013-05-23T15:32:16.827 に答える