1

Succ/Prev 組み込み関数を型指定されたポインター型で使用できるようにする必要があるかどうか疑問に思います。Inc/Decと数学 (PointerVar+1と)のようにPointerVar-1

これらは、ポイントが一部にリストされていない「序数型」にのみ succ/pred を適用します。Pascal Report 1972 (スカラー型と呼んでいます) も同様です。

ただしhttp://www.gnu-pascal.de/gpc/Succ.html#Succは、「ポインターへの Succ の適用は Borland Pascal で定義されている」と主張しています。Pointers Math の結果として、これらの関数を除外することは合理的ではないようです。

この制限は言語的に実証されているのでしょうか、それとも単に実装上の問題なのでしょうか?

program Project9;   // Delphi does have reverse-analogu for Pos/PosEx functions
{$APPTYPE CONSOLE}  // So Delphi IDE ( Version Insight) to cut away a last part
uses                // of string abuses mixing of record helper (LastIndexOf)
  System.SysUtils;  // and System.Copy function. Searchinf to fix it found this...
var
  OutPut, RemoteName: string;
  P: PChar;
begin
  try
    OutPut := 'aaaaaa/zzzzzz';
    P := StrRScan( PChar(OutPut), '/');

    P := Succ(P);
    // XE2: [DCC Fatal Error] Project9.dpr(13): F2084 Internal Error: AV0C068241-R00000000-0
    // 10.1: [dcc32 Error] Project9.dpr(13): E2008 Incompatible types

    P := 1+P;  // Another way to say Succ() - and works in both XE2 and 10.1
    Inc(P);    // Yet one more way to say Succ() - and works in both XE2 and 10.1 too    

    RemoteName := P;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

P: Pointer;PChar ではなく、変更された var タイプと比較するのは興味深いことです。

var P: Pointer; S: String;

P := Succ(P); // error
Inc(P);       // error
P := 1+P;     // works in XE2 if {$POINTERMATH ON}, error if {$POINTERMATH OFF}
              // error in 10.1 regardless

S := PChar(P);  // crashes XE2 if "P := 1+P;" is there above
4

2 に答える 2

4

もちろん、いいえ。言葉のルールに反します。これは正式な契約SuccでありPred、実装しています ( ISO/IEC 7185:1990から):

succ(x)

序数型である式 x から、この関数は、式の型と同じ型である結果を返します (6.7.1 を参照)。そのような値が存在する場合、関数は式 x の序数よりも 1 大きい序数の値を生成します。そのような値が存在しない場合はエラーになります。

pred(x)

序数型である式 x から、この関数は、式の型と同じ型である結果を返します (6.7.1 を参照)。関数は、そのような値が存在する場合、式 x の序数よりも 1 小さい序数の値を生成します。そのような値が存在しない場合はエラーになります。

ご覧のとおり、SuccandPredは序数型の引数に対してのみ定義されているため、ポインター型とは互換性がありません (コントラクトによる固有の序数がないため)。

于 2016-10-13T09:02:10.463 に答える
1

Afaik TP では、いかなる種類のインクリメントも許可されません。また、pchar でさえ許可されていません ($pointermath の前の Delphi では既に許可されていました)。したがって、質問は TP (セグメント化されたメモリ モデル!) と Delphi では異なります。

succ と pred は、序数を操作するように定義されています。ポインターに整数を追加できるにもかかわらず、現在、ポインターは序数型とは見なされません。(序数型などを参照)。

それは序数型である可能性があると主張することができます(デルファイのポインターは上記のリンクの要件に準拠しています)が、メモリモデルがセグメント化されるとすぐにはそうではありません(複数の最小値と最大値があるため)

いずれにせよ、succ と pred については例外を設けることができますが、希望の作業以外のポイントは何でしょうか? これまでできなかったことができるようになるわけではありません。

于 2016-10-13T07:50:57.523 に答える