GetMem auf statische Array

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

GetMem auf statische Array

Beitrag von Mathias »

Müsste mir dies nicht beim kompilieren um die Ohren fliegen ?

Code: Alles auswählen

var
  A: array[0..127] of single;
  B:Single;

begin
  A := PSingle(GetMem(128 * 4));      // geht
  Freemem(PSingle(A));                // geht
  A := Pointer(GetMem(128 * 4));      // Fehler

  B := PSingle(GetMem(128 * 4));      // Fehler
  B := Single(GetMem(128 * 4));       // Fehler    
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1836
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: GetMem auf statische Array

Beitrag von fliegermichl »

Ja, schon etwas merkwürdig, da A ja kein Pointertyp ist.

Benutzeravatar
Zvoni
Beiträge: 740
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
CPU-Target: 64Bit
Wohnort: BW

Re: GetMem auf statische Array

Beitrag von Zvoni »

fliegermichl hat geschrieben: Do 17. Sep 2026, 13:44 Ja, schon etwas merkwürdig, da A ja kein Pointertyp ist.
Behauptet wer?

Code: Alles auswählen

program Project1;
{$mode ObjFPC}{$H+}
Var
  a:Array[0..1] Of Integer;
  p:PInteger;
  pp:^PInteger;
begin
  a[0]:=42;
  a[1]:=123;
  Writeln('Adresse a:   ',PtrInt(@a));
  Writeln('Adresse a[0]:',PtrInt(@a[0]));
  Writeln('Adresse a[1]:',PtrInt(@a[1]));
  p:=a;  //<----!!!! Kein @-Operator
  Write('Adresse p:   ',PtrInt(p));
  Writeln(' - Wert p:', p^);
  Inc(p);
  Write('Adresse p:   ',PtrInt(p));
  Writeln(' - Wert p:', p^);
  Writeln('------------- die andere Richtung ----------');
  pp:=GetMem(2*SizeOf(Integer));
  p:=pp^;
  p^:=38;
  Write('Adresse p:   ',PtrInt(p));
  Writeln(' - Wert p:', p^);
  Inc(p);
  p^:=234;
  Write('Adresse p:   ',PtrInt(p));
  Writeln(' - Wert p:', p^);
  a:=pp^;  //<----!!!! Kein @-Operator
  Writeln('Adresse a:   ',PtrInt(@a));
  Write('Adresse a[0]:',PtrInt(@a[0]));writeln(' - Wert a[0]:',a[0]);
  Write('Adresse a[1]:',PtrInt(@a[1]));writeln(' - Wert a[1]:',a[1]);
  FreeMem(pp);
  Readln;

end.
Ergibt bei mir

Code: Alles auswählen

Adresse a:   4295041040
Adresse a[0]:4295041040
Adresse a[1]:4295041044
Adresse p:   4295041040 - Wert p:42
Adresse p:   4295041044 - Wert p:123
------------- die andere Richtung ----------
Adresse p:   22441800 - Wert p:38
Adresse p:   22441804 - Wert p:234
Adresse a:   4295041040
Adresse a[0]:4295041040 - Wert a[0]:38
Adresse a[1]:4295041044 - Wert a[1]:234
Bedeutet: Die Array-Variable SELBST ist zuweisungskompatibel zum passenden Zeiger-Typ
In die andere Richtung aber auch klar erkennbar, dass die Adressen nicht mehr übereinstimmen, weil ich explizit neuen Speicher angefordert habe

Unabhängig davon: Ja, stimme zu: GetMem/FreeMem hat bei statischen Arrays nix verloren und sollte meckern
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.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1836
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: GetMem auf statische Array

Beitrag von fliegermichl »

Interessanterweise funktioniert das nur, wenn das Array mit dem Index 0 beginnt.
In der Dokumentation konnte ich nichts darüber finden, daß statische Arrays mit Startindex 0 anders behandelt werden.

Antworten