![]() |
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:
Mfg
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. |
Re: Dynamisches Array verursacht brutalen Fehler.
Zitat:
|
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:
|
Re: Dynamisches Array verursacht brutalen Fehler.
Delphi-Quellcode:
\\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():
procedure TForm1.Button1Click(Sender: TObject);
begin Temp1 := (high(MyArray) + 1); Setlength(MyArray, Temp1); MyArray[Temp1-1].a := Temp1; // <-------------------- label1.Caption := IntToStr(Temp1); end; 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 :). |
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:
Mfg & Danke im vorraus
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. |
Re: Dynamisches Array verursacht brutalen Fehler.
MyArray[Temp1-1].a := Temp1;
das wurde dir bei der 2. antwort schon gesagt |
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; |
Re: Dynamisches Array verursacht brutalen Fehler.
hi,
ahh. Jetzt gehts. Danke. Mfg |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz