Je me demande si les intrinsèques Succ/Préc devraient pouvoir être utilisés sur des types de pointeurs typés. Tout comme Inc
/Dec
et les mathématiques (PointerVar+1
et PointerVar-1
).Du POV de la langue, est-ce que Succ/Prev devrait s'appliquer aux pointeurs?
- http://docwiki.embarcadero.com/Libraries/en/System.Succ
- http://www.freepascal.org/docs-html/rtl/system/succ.html
Ceux-ci ne s'appliquent succ/pred aux "types ordinaux" qui ne sont pas répertoriés pointes une partie. Il en est de même pour le rapport Pascal 1972 (appelé types scalaires)
Cependant, les revendications http://www.gnu-pascal.de/gpc/Succ.html#Succ "L'application de Succ aux pointeurs est définie dans Borland Pascal." et il ne semble pas raisonnable d'exclure ces fonctions dans le sillage de Pointers Math.
Cette restriction est-elle justifiée par le langage ou simplement par un problème de mise en œuvre, les fonctions Succ/Pred étant considérées comme quelque peu obscures?
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.
Il est intéressant de le comparer avec le type var changé - P: Pointer;
plutôt que PChar.
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
Je ne peux pas comprendre sur quels motifs nous pourrions répondre. De quelle autorité pouvons-nous faire appel? Comment est-ce autre chose que l'opinion basée? –
Je suis d'accord avec David à ce sujet. –
Peu importe ce que prétend GNU. En Delphi ou Turbo/Borland Pascal, Succ et Pred n'acceptent pas les pointeurs, et bien, Inc et Dec suffisent, IMO. –