![]() |
Austausch-Sortieralgorithmus mit Prozeduren
Liste der Anhänge anzeigen (Anzahl: 1)
Guten Tag,
wir sind jetzt im Unterricht etwas weiter und sind jetzt auch endlich bei den Routinen angekommen. Bis jetzt haben wir nur die Prozeduren kennengelernt, dir wir mit dem Austausch-Sortieralgorithmus in Verbindung bringen sollen. Es ist zwar keine Hausaufgabe, aber dennoch habe ich mir ein bisschen Zeit genommen, um den Quelltext neu zu formulieren. Und genau dort liegt das Problem, ich bin soweit fertig, das Programm startet auch, doch ich erhalte immer, wenn ich den Sortieren-Button klicke eine Zugriffsverletzung. Gut, ich poste euch mal meinen Quelltext und hänge die Projektdateien als Anhang an. Bedanke mich schon einmal im Voraus.
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; ListBox1: TListBox; Edit1: TEdit; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; Type TFeld = Array [1..100] of Integer; var Form1: TForm1; x: Integer; Feld: TFeld; implementation {$R *.dfm} procedure Beenden(); begin Application.Terminate; end; procedure Generieren(var Feld: TFeld; x: Integer); var i: Integer; begin for i := 1 to x do begin Feld[i] := Random(x) + 1; Form1.ListBox1.Items.Add(IntToStr(Feld[i])); end; end; procedure Ausgabe(x: Integer); var i, j: Integer; begin for i := 1 to x do Form1.ListBox1.Items.Add(IntToStr(Feld[j])); end; procedure Tauschen(var Feld: TFeld); var i, j, Temp: Integer; begin if (Feld[i] > Feld[j]) then begin Temp := Feld[i]; Feld[i] := Feld[j]; Feld[j] := Temp; end; Ausgabe(StrToInt(Form1.Edit1.Text)); end; procedure Sortieren(var Feld: TFeld; x: Integer); var i, j: Integer; begin for i := 1 to x - 1 do for j := i + 1 to x do Tauschen(Feld); end; procedure TForm1.Button1Click(Sender: TObject); begin Beenden(); end; procedure TForm1.FormCreate(Sender: TObject); begin Randomize; end; procedure TForm1.Button3Click(Sender: TObject); begin ListBox1.Clear; Generieren(Feld, StrToInt(Form1.Edit1.Text)); end; procedure TForm1.Button2Click(Sender: TObject); begin Ausgabe(StrToInt(Form1.Edit1.Text)); end; end. |
AW: Austausch-Sortieralgorithmus mit Prozeduren
Eiei, jede Menge Fehler sehe ich da...
Die Funktion Sortieren wird gar nicht aufgerufen, warum? Warum sind die Funktionen Sortieren, Tauschen, Ausgabe & Co nicht deklariert? Auch wenn man eine Deklaration weglassen kann, wenn die aufgerufene Funktion vor dem Aufruf steht, so sollte man sich angewöhnen, immer eine Deklaration vorzunehmen.
Delphi-Quellcode:
Öhm, die Schleife benutzt i als Laufvariable, aber der Feldindex benutzt j? Das kann nicht funktionieren und wird wahrscheinlich auch der Grund für die AV sein.
procedure Ausgabe(x: Integer);
var i, j: Integer; begin for i := 1 to x do Form1.ListBox1.Items.Add(IntToStr(Feld[j])); end; Und wäre es nicht besser, das
Delphi-Quellcode:
durch ein
var Feld: TFeld;
Delphi-Quellcode:
zu ersetzen? Bin mir nicht ganz sicher, ob hier dasselbe zutrifft wie bei Objekten, deren Adresse ja durch das const geschützt wird und nicht deren Inhalt.
const Feld: TFeld;
Noch ein paar Kleinigkeiten:
MfG Dalai |
AW: Austausch-Sortieralgorithmus mit Prozeduren
Zitat:
Delphi-Quellcode:
deklariert werden.
forward
Zitat:
Delphi-Quellcode:
Nun steht es dem Compiler offen, ob er "xyz" wie "Result" wertet (TP-Abwärtskompatibilität) oder als Selbstaufruf, der Ausdruck ist nicht eindeutig. Aber zugegeben - rekursive Funktionen haben ja meist Parameter, daher kommt's selten vor.
function xyz: Integer;
begin // do smthng a := xyz; // do smthng end; |
AW: Austausch-Sortieralgorithmus mit Prozeduren
Zitat:
|
AW: Austausch-Sortieralgorithmus mit Prozeduren
Danke für die bisherigen Antworten, aber an einigen Stellen verstehe ich nicht, was gemeint ist. Vielleicht könnte jemand mir in meinem Quelltext Erklärungen bzw. noch nähere Erläuterungen reinschreiben, was zu ändern ist, oder den Quelltext einmal überarbeiten, sodass das Sortieren auch funktioniert. Mein Problem liegt eigentlich nur bei den Prozeduren.
MfG |
AW: Austausch-Sortieralgorithmus mit Prozeduren
Nein. Du musst genauer werden!
Dein Problem liegt nicht nur bei Proceduren. Du hast da einige andere Fehler. |
AW: Austausch-Sortieralgorithmus mit Prozeduren
Zitat:
MfG Dalai |
AW: Austausch-Sortieralgorithmus mit Prozeduren
So..
habe noch einmal die Fehler überarbeitet, die mir hier genannt wurden, das Programm läuft auch, doch beim Sortieren wieder eine Zugriffsverletzung. Vielleicht könnte sich jemand den Quelltext noch mal anschauen oder mir auch noch einmal kurz erläutern, wie man dieses Programm mit Prozeduren umsetzen kann. MfG
Delphi-Quellcode:
Type TFeld = Array [1..100] of Integer;
var Form1: TForm1; Feld: TFeld; implementation {$R *.dfm} procedure Beenden(); begin Application.Terminate; end; procedure Generieren(var Feld: TFeld); var i: Integer; begin for i := 1 to 100 do begin Feld[i] := Random(100) + 1; Form1.ListBox1.Items.Add(IntToStr(Feld[i])); end; end; procedure Ausgabe(j: Integer); var i: Integer; begin for i := 1 to 100 do Form1.ListBox1.Items.Add(IntToStr(Feld[j])); end; procedure Tauschen(var Feld: TFeld; i, j: Integer); var Temp: Integer; begin if (Feld[i] > Feld[j]) then begin Temp := Feld[i]; Feld[i] := Feld[j]; Feld[j] := Temp; end; Ausgabe(j); end; procedure Sortieren(var Feld: TFeld); var i, j: Integer; begin for i := 1 to 100 - 1 do for j := i + 1 to 100 do Tauschen(Feld, i, j); end; procedure TForm1.Button1Click(Sender: TObject); begin Beenden(); end; procedure TForm1.FormCreate(Sender: TObject); begin Randomize; end; procedure TForm1.Button3Click(Sender: TObject); begin ListBox1.Clear; Generieren(Feld); end; procedure TForm1.Button2Click(Sender: TObject); var j: Integer; begin Ausgabe(j); end; end. |
AW: Austausch-Sortieralgorithmus mit Prozeduren
Das hier ist unfug:
Delphi-Quellcode:
Du lässt nur das j.te Element ausgeben.. und das 100 x
procedure Ausgabe(j: Integer);
var i: Integer; begin for i := 1 to 100 do Form1.ListBox1.Items.Add(IntToStr(Feld[j])); end; Edit: + j ist nicht initialisiert so wie du ihn aufrufst (himitsu) |
AW: Austausch-Sortieralgorithmus mit Prozeduren
Zitat:
Selbst Schuld, wenn du nicht auf die Compilermeldungen hörst, denn da steht bestimmt garantiert was vonwengen "j sei nicht initialisiert". Wenn du mal in den Projektoptionen die Bereichsprüfung aktivierst, dann wirst du direkt informiert wo und vorallem warum es da knallt. Es kann auch nicht schaden sich mal mit dem Debugger vertraut zu machen. Erstmal um uns genau die Fehlerstelle zu nennen. ( wurde dir denn keine Fehlerzeile gezeigt? ) Und auserdem hättest du im Debuger selber erkennen können warum es knallt, indem du dir an der Fehlerstelle mal die Variablen ansiehst (speziell das j :roll: ) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:00 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