Dynamisches Array of Record

Für Fehler in Lazarus, um diese von anderen verifizieren zu lassen.
Antworten
Ralph59
Beiträge: 145
Registriert: So 22. Mär 2009, 07:48
OS, Lazarus, FPC: WIN 11 (momentan )
CPU-Target: 64 und 32Bit
Wohnort: Hessen
Kontaktdaten:

Dynamisches Array of Record

Beitrag von Ralph59 »

Hallo,

habe gerade mal einem Kollegen gezeigt wie Records und / oder Arrays im Lazarus mit FPC funktionieren. Natürlich kamen dabei auch ein paar Fragen auf, so z.B. dass wir ein Array of Records erstellt haben...

Aber nun zu meinem Thema,
Ich habe also ein Record erstellt:

Code: Alles auswählen

 
type
  TMeinRekord = Record
    Name : String[10];
    PLZ: integer;
    alter: integer;
  end;
 
...
 
  public
    Test2Rec : Array of TMeinRekord;
 
// Die Größe haben wir dann erst einmal beim formCreate mit 3 festgelegt.
procedure TForm1.FormCreate(Sender: TObject);
begin
    SetLength(Test2Rec,2);
    SetLength(TestArray,2);
 
end;
 


soweit, so gut.
Nun haben wir Daten in die records gescchrieben und uns wieder anzeigen lassen.
Das Problem war nur, dass wir ohne Änderung der Größe mit SetLength(Test2Rec,...) beliebig viele Records füllen konnten und auch abfragen konnten ohne dass ein Fehler aufgetreten ist.
Erst beim Schließen der Anwendung ist ein Fehler aufgetreten.
Ist das bei euch auch so?

Ich habe auf diesem Rechner momentan: 09.31 mit FPC 2.4.3

Mit freundlichem Gruß

Ralph
PS: Beim nächsten Teamtreffen versuche ich wieder dabei zu sein.:-)
Fehler sind wie Berge, man steht auf dem Gipfel seiner eigenen und redet über die der anderen.

Helmi79
Beiträge: 1
Registriert: Di 20. Nov 2012, 18:49

Re: Dynamisches Array of Record

Beitrag von Helmi79 »

Hallo Ralph,

ich benutze 1.1 fpc 2.6.0
Bei mir ist das ganz genau so wie bei Dir beschrieben.

Hm :-(

Gruß Helmi

Ralph59
Beiträge: 145
Registriert: So 22. Mär 2009, 07:48
OS, Lazarus, FPC: WIN 11 (momentan )
CPU-Target: 64 und 32Bit
Wohnort: Hessen
Kontaktdaten:

Re: Dynamisches Array of Record

Beitrag von Ralph59 »

Hallo,

ach übrigens, bei statischen Array tritt ein Fehler auf.


Mit freundlichem Gruß

Ralph
Fehler sind wie Berge, man steht auf dem Gipfel seiner eigenen und redet über die der anderen.

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Dynamisches Array of Record

Beitrag von mschnell »

Ralph59 hat geschrieben:Das Problem war nur, dass wir ohne Änderung der Größe mit SetLength(Test2Rec,...) beliebig viele Records füllen konnten und auch abfragen konnten ohne dass ein Fehler aufgetreten ist.


Vermutlich wird diese Fehlerhafte Programmierung nicht abgefangen (um eine Fehlermeldung zu machen ... falls das technisch überhaupt möglich ist)

Es führt also zu einem erstmal verdeckten Fehler (überschreiben irgendwelcher Speicherbereiche) was sich dann erst später rächt.

Finde ich eigentlich ziemlich normal.

-Michael

Ralph59
Beiträge: 145
Registriert: So 22. Mär 2009, 07:48
OS, Lazarus, FPC: WIN 11 (momentan )
CPU-Target: 64 und 32Bit
Wohnort: Hessen
Kontaktdaten:

Re: Dynamisches Array of Record

Beitrag von Ralph59 »

Hallo Michael,
nett, dass Du geantwortet hast, ja ich gebe Dir recht, es ist etwas fehlerhaft programmiert. Aber, es ist mir bis jetzt noch nie passiert, dass wenn ich eine Größe eines Array bestimme und dieses z.B. bei einem dynamischen Array nicht anpasse, dass sich der Debugger nicht automatisch mit einem Fehler meldet. Welches natürlich im nachhinein eine Fehlersuche deutlich erschwert.

ich denke eher, dass, dadurch, dass der Speicherbereich dynamisch bei der Abarbeitung vergeben wird, der Fehler erst beim Schließen (Terminate / freimachen) in der Größe nicht übereinstimmt. Aber was ist dann mit dem bereits beschriebenen Speicher, der nicht vorher zugewiesen wurde?

Wie auch immer, es ist mir ja nur aufgefallen und hat mich ein wenig verwundert.

Mit freundlichem Gruß

Ralph
Fehler sind wie Berge, man steht auf dem Gipfel seiner eigenen und redet über die der anderen.

Soner
Beiträge: 623
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: Dynamisches Array of Record

Beitrag von Soner »

Ich habe es auch geprüft, tatsächlich kann man über Arraygrenzen auf Records zugreifen. Das Programm läuft ganz normal, es erzeugt auch kein Fehler beim beenden des Programms. Anscheinend ist es normal weil bei Lazaurs standardmäßig Bereichsprüfung abschaltet ist. Wenn man Bereichsprüfung einschaltet dann taucht an der betreffonen Zeile "ERangeError"-Exception, wie es sein soll.

Hier ist das Testprogramm:

Code: Alles auswählen

 
unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs;
 
type
  TMeinRekord = Record
    Name : String[10];
    PLZ: integer;
    alter: integer;
  end;
 
  { TForm1 }
 
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
    Test2Rec : Array of TMeinRekord;
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  SetLength(Test2Rec,2);
  Test2Rec[0].Name:='tst';
 
  Test2Rec[4].Name:='hello'//funktioniert ohne Probleme (bei eingeschaltete Bereichsprüfung tauch ERangeError)
  Test2Rec[0].PLZ:=11;
  Caption:=Test2Rec[4].Name; //funktioniert ohne Probleme
end;
 
procedure TForm1.FormDestroy(Sender: TObject);
begin
  SetLength(Test2Rec,0);
  Test2Rec:=nil;
end;
 
end.   
 

Ralph59
Beiträge: 145
Registriert: So 22. Mär 2009, 07:48
OS, Lazarus, FPC: WIN 11 (momentan )
CPU-Target: 64 und 32Bit
Wohnort: Hessen
Kontaktdaten:

Re: Dynamisches Array of Record

Beitrag von Ralph59 »

Hallo Soner,

danke für deine Mühe. Bereichsüberprüfung aktiviert und schon läuft es so,wie ich mir das vorstelle.

Danke :wink:

Mit freundlichem Gruß

Ralph
Fehler sind wie Berge, man steht auf dem Gipfel seiner eigenen und redet über die der anderen.

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Dynamisches Array of Record

Beitrag von mschnell »

Soner hat geschrieben:Ich habe es auch geprüft, tatsächlich kann man über Arraygrenzen ... zugreifen.

Per Design vergrößern sich dynamische Arrays nie automatisch (einfach durch den Zugriff).

Klar, sonst müsste bei jedem Zugriff eine komplexe Bereichsprüfung stattfindenm, was die Ausführung erheblich verlangsamen würde.

Man kann eine Bereichsprüfung mit eine "{$" - Option einschalten. Dann kommt eine Fehlermeldung bei unzulässigen Zugriffen. Ich habe aber nie getestet, ob das auch für dynamische Arrays greift.

Es ist aber auch durchaus möglich, einfach riesige "feste" Arrays anzulegen (Global oder lokal auf dem Stack). Zunächst legt das Betriebssystem den Speicher nur virtuell an. Er wird erst physikalisch zur Verfügung gestellt, wenn ein Zugriff erfolgt. Das macht aber nicht der Compiler, sondern das OS. der Zugriffst-Test kostet keine Zeit (macht die Memory-Manager Hardware der CPU). Nur das zur-Verfügung-Stellen kostet das OS natürlich Arbeit.

-Michael
Zuletzt geändert von mschnell am Mi 21. Nov 2012, 09:42, insgesamt 1-mal geändert.

Ralph59
Beiträge: 145
Registriert: So 22. Mär 2009, 07:48
OS, Lazarus, FPC: WIN 11 (momentan )
CPU-Target: 64 und 32Bit
Wohnort: Hessen
Kontaktdaten:

Re: Dynamisches Array of Record

Beitrag von Ralph59 »

Soner hat geschrieben:Ich habe es auch geprüft, tatsächlich kann man über Arraygrenzen ... zugreifen.


-Michael hat geschrieben:

Per Design vergrößern sich dynamische Arrays nie automatisch (einfach durch den Zugriff).


Das war ja genau das, was mich verwundert hat. Das Array hat sich automatisch, ohne neue Erweiterung vergrößert und konnte auch abgerufen werden!

Wie auch immer, ist mir ja nur aufgefallen.

Und ja,
Zunächst legt das Betriebssystem den Speicher nur virtuell an. Er wird erst physikalisch zur Verfügung gestellt, wenn ein Zugriff erfolgt.

das ist mir auch klar, aber ich habe mich gefragt, was macht das OS mit dem nicht zugewiesenem Speicher beim schließen z.B. der Anwendung?
Bleiben dort irgendwelche Leichen :?:

Mit freundlichem Gruß

Ralph
Fehler sind wie Berge, man steht auf dem Gipfel seiner eigenen und redet über die der anderen.

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Dynamisches Array of Record

Beitrag von mschnell »

Ralph59 hat geschrieben: ich habe mich gefragt, was macht das OS mit dem nicht zugewiesenem Speicher beim schließen z.B. der Anwendung?


Das geht nur mit zugewiesenen Speicher-Adressen, die nicht benutzt werden und deshalb keinen physikalischen Speicher brauchen. Wird eine nicht zugewiesene Adresse angesprochen, stoppt das OS das Programm mit Fehler.

Antworten