AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Dynamisches Array verursacht brutalen Fehler.
Thema durchsuchen
Ansicht
Themen-Optionen

Dynamisches Array verursacht brutalen Fehler.

Ein Thema von VT-DA · begonnen am 29. Jul 2005 · letzter Beitrag vom 29. Jul 2005
Antwort Antwort
Benutzerbild von VT-DA
VT-DA

Registriert seit: 20. Jul 2005
Ort: Heiden
59 Beiträge
 
#1

Dynamisches Array verursacht brutalen Fehler.

  Alt 29. Jul 2005, 15:35
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.

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
  Mit Zitat antworten Zitat
Bart82

Registriert seit: 27. Aug 2004
24 Beiträge
 
Delphi 7 Professional
 
#2

Re: Dynamisches Array verursacht brutalen Fehler.

  Alt 29. Jul 2005, 15:39
Zitat:
Temp1 := (high(MyArray) + 1);
Bist du sicher, dass das funktioniert? Die Länge ist ja bis dahin noch unbekannt!
Carsten
Life's a piece of shit
when you look at it!
- Monty Python -
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#3

Re: Dynamisches Array verursacht brutalen Fehler.

  Alt 29. Jul 2005, 15:39
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 von Bart82:
Zitat:
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.
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Dynamisches Array verursacht brutalen Fehler.

  Alt 29. Jul 2005, 15:39
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 .
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Benutzerbild von VT-DA
VT-DA

Registriert seit: 20. Jul 2005
Ort: Heiden
59 Beiträge
 
#5

Re: Dynamisches Array verursacht brutalen Fehler.

  Alt 29. Jul 2005, 15:55
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
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#6

Re: Dynamisches Array verursacht brutalen Fehler.

  Alt 29. Jul 2005, 15:58
MyArray[Temp1-1].a := Temp1;


das wurde dir bei der 2. antwort schon gesagt
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Dynamisches Array verursacht brutalen Fehler.

  Alt 29. Jul 2005, 16:01
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;
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von VT-DA
VT-DA

Registriert seit: 20. Jul 2005
Ort: Heiden
59 Beiträge
 
#8

Re: Dynamisches Array verursacht brutalen Fehler.

  Alt 29. Jul 2005, 16:08
hi,

ahh. Jetzt gehts. Danke.

Mfg
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:03 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