Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Dynamisches Array verursacht brutalen Fehler. (https://www.delphipraxis.net/50687-dynamisches-array-verursacht-brutalen-fehler.html)

VT-DA 29. Jul 2005 15:35


Dynamisches Array verursacht brutalen Fehler.
 
Hi,

damit ich die Dynamischen Arrays besser verstehe, habe ich mir ein beispielprogramm geschrieben mit dem ich lernen kann. Doch leider kommt immer ein kritischer Fehler wenn ich auf die Arrays zugreife.
Vllt könnte mir hier mal jemand kurz einen kleinen Schubser geben. :zwinker:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

type bla = record
  a:Integer;
end;

var
  Form1: TForm1;
  MyArray: Array of bla;
  Temp1: Integer;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Temp1 := (high(MyArray) + 1);
  Setlength(MyArray, Temp1);
  MyArray[Temp1].a := Temp1;
    label1.Caption := IntToStr(Temp1);
end;

end.
Mfg

Bart82 29. Jul 2005 15:39

Re: Dynamisches Array verursacht brutalen Fehler.
 
Zitat:

Delphi-Quellcode:
Temp1 := (high(MyArray) + 1);

Bist du sicher, dass das funktioniert? Die Länge ist ja bis dahin noch unbekannt!

Muetze1 29. Jul 2005 15:39

Re: Dynamisches Array verursacht brutalen Fehler.
 
Und darüber wunderst du dich?

1. High() liefert dir den höchsten Index des Arrays zurück. Und das wäre bei einem leeren Array? 0 ? nein, es ist -1 und -1 + 1 ergibt 0. Somit setzt du eine Arraygrösse von 0.
2. Length() liefert dir die Länge des Arrays - also die Anzahl der Einträge.
3. Zu 1.: Wenn du eine Schleife mit For i := Low() To High() Do hast, dann ist Low() 0 und High() muss -1 sein, sonst würde die Schleife mit i=0 durchlaufen werden, obwohl das Array kein Element hat.

Zitat:

Zitat von Bart82
Zitat:

Delphi-Quellcode:
Temp1 := (high(MyArray) + 1);

Bist du sicher, dass das funktioniert? Die Länge ist ja bis dahin noch unbekannt!

Die Länge ist nicht unbekannt - es ist eine globale Variable und somit wird sie initialisiert - und ist somit ein Array mit der Länge von 0.

dizzy 29. Jul 2005 15:39

Re: Dynamisches Array verursacht brutalen Fehler.
 
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Temp1 := (high(MyArray) + 1);
  Setlength(MyArray, Temp1);
  MyArray[Temp1-1].a := Temp1; // <--------------------
    label1.Caption := IntToStr(Temp1);
end;
\\edit2: Man beachte das Posting hier vor - Temp1 ist nicht 0 sondern -1. Ich hatte mich verlesen und ein Length() gesehen wo ein High() stand ;). Somit gilt folgende Aussage für den QT mit Length() anstelle von High():
Das erste Element in deinem Array hat den Index 0. Temp1 ist bei dir nach dem ersten Aufruf 1. Damit setzt du dein Array auf die Länge eins, das Element sitzt aber an Index 0!
Bei nullbasierten Arrays gilt immer: höchster Index = Länge-1

\\edit: Roter Kasten wieder kaputt :).

VT-DA 29. Jul 2005 15:55

Re: Dynamisches Array verursacht brutalen Fehler.
 
Hi,

hmm. Irgendwie klappt das nicht was ihr sagt.
high gibt also den Wert -1 am Anfang wieder und somit erstelle ich 0 Einträge.
Jetzt habe ich das genze mal nen bischen Manipuliert aber es klappt trodzdem nciht.
was habe ich also jetzt wieder falsch gemacht?

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

type bla = record
  a:Integer;
end;

var
  Form1: TForm1;
  MyArray: Array of bla;
  Temp1: Integer = 0; // da

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Temp1 := Temp1 + 1; // da
  Setlength(MyArray, Temp1);
  MyArray[Temp1].a := Temp1;
    label1.Caption := IntToStr(Temp1);
end;

end.
Mfg & Danke im vorraus

brechi 29. Jul 2005 15:58

Re: Dynamisches Array verursacht brutalen Fehler.
 
MyArray[Temp1-1].a := Temp1;


das wurde dir bei der 2. antwort schon gesagt

SirThornberry 29. Jul 2005 16:01

Re: Dynamisches Array verursacht brutalen Fehler.
 
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Temp1 := Length(MyArray) + 1;
  Setlength(MyArray, Temp1);
  MyArray[Temp1 - 1].a := Temp1;
    label1.Caption := IntToStr(Temp1);
end;

VT-DA 29. Jul 2005 16:08

Re: Dynamisches Array verursacht brutalen Fehler.
 
hi,

ahh. Jetzt gehts. Danke.

Mfg


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:52 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz