Succ/Prev 組み込み関数を型指定されたポインター型で使用できるようにする必要があるかどうか疑問に思います。Inc
/Dec
と数学 (PointerVar+1
と)のようにPointerVar-1
。
- http://docwiki.embarcadero.com/Libraries/en/System.Succ
- http://www.freepascal.org/docs-html/rtl/system/succ.html
これらは、ポイントが一部にリストされていない「序数型」にのみ 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