Dynamische Array und Pointer Vermischung

Für Fehler in Lazarus, um diese von anderen verifizieren zu lassen.
Mathias
Beiträge: 7288
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Dynamische Array und Pointer Vermischung

Beitrag von Mathias »

Gerade habe ich keinen FPC zur Hand, habt ihr mal Versucht nil zu Typecasten?
Wie ich es erwartet habe:

Code: Alles auswählen

  var
    p: PInteger;
  begin
    p := Pointer(nil);    // Geht
    p := PInteger(nil);   // Geht
    p := PByte(nil);      // Geht nicht
Du kannst Pointer auch mit Array-Syntax verwenden:
Bei C-Bindungen ist dies gang un gäbe.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Warf
Beiträge: 2292
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Dynamische Array und Pointer Vermischung

Beitrag von Warf »

Socke hat geschrieben: Mo 4. Mai 2026, 12:10 Du kannst Pointer auch mit Array-Syntax verwenden:

Code: Alles auswählen

var
  p: PInteger;
begin
  p[20] := 15;
end;
Basierend auf dem Basistypen errechnet der Compiler dann automatisch die Speicheradresse. Im Gegensatz zu Arrays fällt dann aber die Speicherveraltung, Größeninformationen und ggf. RangeChecking weg.
Wobei das nicht der "klassische" Pascal Weg ist und auch nicht in allen modi geht (ich glaube bei Mode Delphi geht es nur für basis typen). Ursprünglich konnte Pascal ja auch keine Pointer Arithmetik. Der eigentlich "vorgesehene" Weg ist der cast in einem statischen Array:

Code: Alles auswählen

PIntegerArray(MyPointer)^[20] := 15;
Dabei ist IntegerArray in der RTL Definiert als (auf 32 bit):

Code: Alles auswählen

type IntegerArray = array [0..$effffff] of Integer;

Antworten