Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Benachrichtigung über Debugger-Exception- Problem (https://www.delphipraxis.net/165024-benachrichtigung-ueber-debugger-exception-problem.html)

rossi37 11. Dez 2011 17:44

Benachrichtigung über Debugger-Exception- Problem
 
Hi,
zu Beginn erstmal ein Hallo ans Forum, bin neu hier! :)
Ich bin wirklich ein totaler Anfänger im Programmieren, von daher kann es sien, dass mein Problem für euch lächerlich oder so erscheint, aber ich kriege es einfahc nicht auf die Reihe.

Also wir sollen im Informatik-Unterricht mit delphi, ein Programm mit heapsort-Sortierverfahren erstellen.

Ich habe echt keine Ahnung, ob mein Programm so wie ich es da zusammengeschrieben habe Sinn macht, aber ich zeig es euch mal.

Code:
unit heapsort_verfahren_u;

interface

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

type
  Theapsort = class(TForm)
    mAusgabe: TMemo;
    btnZahlen: TButton;
    btnSortieren: TButton;
    procedure btnZahlenClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure btnSortierenClick(Sender: TObject);
    procedure refillMemo();



  private
    i: integer;
    Data: array of integer;
    procedure sortierverfahren(Data: array of integer);
    procedure Erstelleheap(i: integer; Data: array of integer; knot: integer);
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  heapsort: Theapsort;

implementation

{$R *.dfm}

procedure Theapsort.FormCreate(Sender: TObject);
begin
 SetLength(Data,1);
end;



procedure Theapsort.btnSortierenClick(Sender: TObject);
begin
sortierverfahren(Data);
refillMemo();
end;

procedure Theapsort.btnZahlenClick(Sender: TObject);
var
c, zahl,i: integer;
begin
for c:=0 to 10 do
begin
randomize;
zahl:=random(100)+1;
SetLength(Data, Length(Data)+1);
i:=i+1;
Data[i]:=zahl;
refillMemo();
end;
end;

procedure Theapsort.sortierverfahren(Data: array of integer);
var
 knot, temp, i: integer;
begin
  i:= Length(Data);

  knot:= i div 2;
  while knot > 0 do
  begin
    dec(knot);
    Erstelleheap(i, Data, knot);
  end;

  while i >= 0 do
  begin
    temp:= Data[0];
    Data[0]:= Data[i];
    Data[i]:= temp;

    Erstelleheap(i,Data, 0);
    Dec(i);
  end;
end;

procedure Theapsort.Erstelleheap(i: integer; Data: array of integer; knot: integer);
var
 temp_knot_value, subknot: integer;
begin
  temp_knot_value := Data[knot];

  while knot < i div 2 do
  begin
  subknot := 2*knot+1;

  if (subknot < i-1) and (Data[subknot]< Data [subknot +1])
    then Inc(subknot);

  if temp_knot_value >= Data[subknot]
    then break;

  Data[knot]:= Data[subknot];

  end;
  Data[knot]:= temp_knot_value;
end;



procedure Theapsort.refillMemo();
var
a:Integer; Data: Array of integer;
begin
mAusgabe.Text:='';
for a:= 1 to Length(Data)-1 do
  begin
  mAusgabe.text:= mAusgabe.Text + Inttostr(Data[a])+#13#10;
  end;
end;

end.
Aufjedenfall bekomme ich, wenn ich den Debugger starten will, die Meldung:
"Im Projekt heapsort_verfahren.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung 'Zugriffsverletzung bei Adresse 0044FD2E in Modul 'heapsort_verfahren.exe'. Schreiben von Adresse 00E1030C'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen."

Woran könnte das liegen, ich vermute mal und hoffe, dass ihr mir sagen könnt wo der Fehler ist.

Grüße,
rossi37

daywalker9 11. Dez 2011 18:30

AW: Benachrichtigung über Debugger-Exception- Problem
 
Und in welcher Zeile tritt das auf?

rossi37 11. Dez 2011 19:17

AW: Benachrichtigung über Debugger-Exception- Problem
 
procedure btnZahlenClick
...

Data[i]:=zahl;
da wirds mir angezeigt.

aber da wurde schonmal gemeckert weil Variable Data und i nicht initialisiert werden konnten. (?)

tut mir leid ich hab' echt keine Ahnung von Delphi! :D

hoika 11. Dez 2011 19:56

AW: Benachrichtigung über Debugger-Exception- Problem
 
Hallo,

zahl:=random(100)+1;
zahl zwischen 1 und 100

SetLength(Data, Length(Data)+1);
Länge von data um 1 erhöhen (im FormCreate wurde es auf 1 gesetzt)

i:=i+1;
i um 1 erhöhen
Welchen Wert hat denn i vor dieser Zeile ???
Der Wert ist unbekannt (lokale Variablen haben keinen Default-Wert)

Data[i]:=zahl;

Zugriff auf ... tja worauf denn ?



Heiko

rossi37 11. Dez 2011 20:05

AW: Benachrichtigung über Debugger-Exception- Problem
 
Zitat:

Zitat von hoika (Beitrag 1140853)
Hallo,

zahl:=random(100)+1;
zahl zwischen 1 und 100

ich dachte so kann ich einfahc mal zufallszahlen erstellen, ovn 1 - 100?! Ich soll das ganze ja präsentieren und brauch doch irgendwie einfahc mal Zahlen, also dachte ich mir so.


Zitat:

Zitat von hoika (Beitrag 1140853)
SetLength(Data, Length(Data)+1);
Länge von data um 1 erhöhen (im FormCreate wurde es auf 1 gesetzt)

i:=i+1;
i um 1 erhöhen
Welchen Wert hat denn i vor dieser Zeile ???
Der Wert ist unbekannt (lokale Variablen haben keinen Default-Wert)

Data[i]:=zahl;

Zugriff auf ... tja worauf denn ?

könntest du mir hier evtl. noch ein paar Lösungsansätze mit auf den Weg geben?

Danke,
rossi37

himitsu 11. Dez 2011 22:48

AW: Benachrichtigung über Debugger-Exception- Problem
 
In welcher Quellcodezeile kommt der Fehler?
Arg, faule RedBox und ich sollte nebenbei mich nicht zu lange ablenken lassen.


Randomize ruft man nur einmal auf und nicht mehrmals (steht auch in der OH).

Die Codeformatierung ist grauenhaft.

PS: das [DELPHI]-Tag ist schöner, als das [CODE]-Tag.

Tipp: Schalte mal die Indexprüfung an, in den Projektoptionen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 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