Ich habe gerade dies vor meiner Nase und die proceduren werden anstandslos kompilert.
Darf dies so sein. oder ist das ein Bug ?
Ist es aber ausserhalb der procedure, dann motzt er wie erwartet.
program Project1;
procedure test1(pointer: pointer); // geht
begin
pointer := nil;
end;
procedure test2(integer: integer); // geht
begin
integer := 123;
end;
var
Pointer=Pointer; // da motz er
begin
test1(nil);
test2(1234);
end.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Deklarierst du Pointer lokal, dann überschreibt er nicht die globale Typendefinition. Versuchst du es global zu deklarieren, dann gibt es den Pointer-Typ nicht mehr.
Wenn du . eine funktionsfähige - Deklaration vor deine Prozedur schiebst...
Program PtrTest;
var Pointer : string;
procedure ZeigePointer(Ptr : Pointer);
begin
WriteLn(IntToHex(PtrInt(Ptr), SizeOf(Pointer)*2));
end;
begin
Pointer := 'Hallo';
ZeigePointer(@Pointer);
end.
Der Compiler meckert jetzt bei der Deklaration von ZeigePointer mit "Type identifier expected", weil es den Typ Pointer jetzt nicht mehr gibt.
Program PtrTest;
var Pointer : string;
procedure ZeigePointer(Ptr : Pointer);
begin
WriteLn(IntToHex(PtrInt(Ptr), SizeOf(Pointer)*2));
end;
begin
Pointer := 'Hallo';
ZeigePointer(@Pointer);
end.
Der Compiler meckert jetzt bei der Deklaration von ZeigePointer mit "Type identifier expected", weil es den Typ Pointer jetzt nicht mehr gibt.
Program PtrTest;
Uses Sysutils; //Braucht man für IntToHex
var Pointer : string;
procedure ZeigePointer(Ptr : System.Pointer); //Voll qualifizierter Typ mit Unit-Namen, wo er definiert ist
begin
WriteLn(IntToHex(PtrInt(Ptr), SizeOf(Pointer)*2));
end;
begin
Pointer := 'Hallo';
ZeigePointer(@Pointer);
Readln;
end.
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.
program Project1;
procedure test1(pointer: pointer); // geht
begin
pointer := nil;
end;
procedure test2(integer: integer); // geht
begin
integer := 123;
end;
var
Pointer: System.Pointer; // geht auch
begin
test1(nil);
test2(1234);
end.
0118999881999119725-3
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
Womit wir den Bumerang bekommen zu:
Benutze halt keine Keywords als Variablen-Namen *schulterzuck*
Glaube mich sogar daran zu erinnern, dass irgendwas deswegen sogar in der Doku steht.
Bin mir aber nicht sicher
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.
af0815 hat geschrieben: Mo 7. Sep 2026, 14:25
Ein Typ ist kein Keywort.
Argghh.....stimmt.....
Du weisst was ich meine
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.
Shadowing regeln in FPC sind etwas seltsam. Grundsätzlich ist es erst mal nur ein Fehler wenn es keine Mööglichkeit zur Auflösung gibt. Über den Qualifizierten Namen kann man über Units hinweg immer auflösen wie von Zvoni gezeigt mit System.Pointer. Das einzige was gar nicht erlaubt ist, ist wenn es keine Möglichkeit mehr zum Auflösen gibt (z.B. zwei globale Bezeichner in der gleichen Unit).
In manchen Situationen ist Shadowing darüber hinaus nicht erlaubt, z.B.:
Warf hat geschrieben: Mo 7. Sep 2026, 15:17
Shadowing regeln in FPC sind etwas seltsam. Grundsätzlich ist es erst mal nur ein Fehler wenn es keine Mööglichkeit zur Auflösung gibt. Über den Qualifizierten Namen kann man über Units hinweg immer auflösen wie von Zvoni gezeigt mit System.Pointer. Das einzige was gar nicht erlaubt ist, ist wenn es keine Möglichkeit mehr zum Auflösen gibt (z.B. zwei globale Bezeichner in der gleichen Unit).
In manchen Situationen ist Shadowing darüber hinaus nicht erlaubt, z.B.:
type TMyClass = class
public
MyInt: Integer;
procedure Foo(MyInt:Integer); // Error Duplicate Identifier in Mode ObjFPC
end;
Das gibt in Mode ObjFPC einen Fehler obwohl man über Self MyInteger immer auflösen kann. In Mode Delphi ist das aber erlaubt.
Wobei ich aber dann sage: Wer Typen-Bezeichner als Variablen-Namen verwendet ("..... (pointer : pointer)" oder "Var pointer:String;") hat dann sowieso kein Mitleid von mir zu erwarten.
In einem Programmierer-Team wäre das mMn sogar ein Grund für eine Abmahnung
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.