Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Selectionsort - Problem mit richtiger Zuweisung der Werte (https://www.delphipraxis.net/169932-selectionsort-problem-mit-richtiger-zuweisung-der-werte.html)

thechus 21. Aug 2012 20:58

Delphi-Version: 5

Selectionsort - Problem mit richtiger Zuweisung der Werte
 
Hey, ich habe hier ein Problem.
Als ich in meinem Programm folgende Prozedur aufrufen ließ, hängt sich Delphi auf.

Ich weiß aber nicht, wo der Fehler liegt...

hier die Prozedur:

Code:
var
  Form1: TForm1;
  Werte: Array[1..max] of Integer;
  Anzahl,Zahl: integer;

[...]


procedure TForm1.SelectionSort;
var i,k,maxi,j:integer;
    wert: word;
begin
 maxi := high(Werte);
 for i := 0 to maxi - 1 do
  begin
   wert := werte[i];
   k := i;
   for j := i + 1 to maxi do if werte[j] < wert then
    begin
     wert := werte[j];
     k := j;
   end;
  werte[k] := werte[i];
  werte[i] := wert;
  end;
end;
Dane fur eure Hilfe!

Gruß,
thechus

Uwe Raabe 21. Aug 2012 21:00

AW: Ich weiß nicht, was da falsch ist
 
Zitat:

Zitat von thechus (Beitrag 1179144)
Code:
  Werte: Array[1..max] of Integer;

Welchen Wert hat max?

thechus 21. Aug 2012 21:01

AW: Ich weiß nicht, was da falsch ist
 
Hey,

const
max = 1000000;

Ich weiß, dass es keinen Sinn hat.
Der Lehrer verlangt dies so, zur Vorbereitung auf die bald kommenden dynamischen Arrays,

Super schnelle Antwort, wie immer!

Gruß,
thechus

Furtbichler 21. Aug 2012 21:05

AW: Ich weiß nicht, was da falsch ist
 
Delphi hängt sich nicht auf, sondern sortiert sich nen Wolf.

Ändere mal die eine Zuweisung 'maxi := ...' von 'High(Werte)' auf die tatsächliche Anzahl der im doch recht großen Array enthaltenen Werte. Oder hast Du gleich 1000000000 Werte da drinnen?

SelectionSort ist eh ziemlich lahm, weil ja für jedes Element im Schnitt n/2 Vergleiche ausgeführt werden müssen. Und 'n' ist bei dir doch recht groß.

thechus 21. Aug 2012 21:12

AW: Ich weiß nicht, was da falsch ist
 
Hey,

das ist mir gerade aufgefallen, als ich von Herrn Raabe hingewiesen wurde.
Ich hab den Wert geändert:

Code:
procedure TForm1.SelectionSort;
var i,k,maxi,j:integer;
    wert: word;
begin
 maxi := high(Anzahl);
 for i := 0 to maxi - 1 do
  begin
   wert := werte[i];
   k := i;
   for j := i + 1 to maxi do if werte[j] < wert then
    begin
     wert := werte[j];
     k := j;
   end;
  werte[k] := werte[i];
  werte[i] := wert;
  end;
end;
Anzahl und die Prozedur kommen hier ins Spiel:

Code:
procedure TForm1.Button2Click(Sender: TObject);
var
anfang, ende: real;
begin
 ListBox2.clear;
 Anzahl := StrToInt(Edit1.Text);
 pause(100);
 PnlZeit.Caption := 'Die Zeit läuft...';
 Anfang := Time;
 if combobox2.ItemIndex = 0 then bubblesort;
 if combobox2.ItemIndex = 1 then selectionsort;
[...]
Momentane Fehlermeldung:
Es taucht beim Klick auf Button2 ein Fenster mit:
"Im Projekt Project1.exe ist ein Exeption der Klasse EAccessViolation aufgetreten[...]"
Debugger sagt:
[Warnung] Unit1.pas(110): Vorzeichenbehaftete und -lose Typen werden kombiniert - beide Operanden werden erweitert

Was ist denn da zu tun?

Danke für eure Hilfe!

Edit: Ich sollte noch hinzufügen, dass er die folgende Zeile Markiert:
Code:
   for j := i + 1 to maxi do if werte[j] < wert then

Gruß,
thechus

Lemmy 21. Aug 2012 21:26

AW: Ich weiß nicht, was da falsch ist
 
Zitat:

Zitat von thechus (Beitrag 1179151)
Momentane Fehlermeldung:
Es taucht beim Klick auf Button2 ein Fenster mit:
"Im Projekt Project1.exe ist ein Exeption der Klasse EAccessViolation aufgetreten[...]"

dann mach einen Brakepoint in die Prozedur und sag uns an welcher Stelle diese Fehlermeldung erscheint.

Zitat:

Zitat von thechus (Beitrag 1179151)
Debugger sagt:
[Warnung] Unit1.pas(110): Vorzeichenbehaftete und -lose Typen werden kombiniert - beide Operanden werden erweitert

Du vergleichst einen Word mit einem Integer. Schon mal in der Hilfe nachgeschaut (Integer-Typen) was ein Word und ein Integer ist?

Grüße

thechus 21. Aug 2012 21:31

AW: Ich weiß nicht, was da falsch ist
 
Zitat:

Zitat von Lemmy (Beitrag 1179152)

dann mach einen Brakepoint in die Prozedur und sag uns an welcher Stelle diese Fehlermeldung erscheint.

Du vergleichst einen Word mit einem Integer. Schon mal in der Hilfe nachgeschaut (Integer-Typen) was ein Word und ein Integer ist?

Die Stelle habe ich oben nochmal ergänzt, wohl zu spät tut mir leid.
Hmm... selbst wenn ich beide Werte als Integer deklariere taucht die Fehlermeldung auf.

Danke für die Hilfe.

Gruß,
thechus

Furtbichler 21. Aug 2012 21:36

AW: Ich weiß nicht, was da falsch ist
 
Zitat:

Zitat von thechus (Beitrag 1179151)
Code:
procedure TForm1.SelectionSort;
...
 maxi := high(Anzahl);
...

Na? Welchen Wert hat maxi nun?

Luckie 21. Aug 2012 21:37

AW: Ich weiß nicht, was da falsch ist
 
Mach aus wert einen Integer. Word ist ohne Vorzeichen, Integer schon. Der Datentyp Word ist eh unsinnig.

thechus 21. Aug 2012 21:43

AW: Ich weiß nicht, was da falsch ist
 
Zitat:

Zitat von Furtbichler (Beitrag 1179157)
Na? Welchen Wert hat maxi nun?

Ach!!
So hat maxi ja den Wert 100...8Wenn man im Editfeld 100 eingibt)

Das Programm generiert ja zunächst eine Liste aus zufälligen Zahlen aus der Menge Anzahl.
Somit muss ich doch "High(Werte[i])" nehmen, da das gerade die Werte sind, die unsortiert sind. Davon die größte Zahl.

An der Fehlermeldung hat dies aber nichts weiter geändert...
Kommt man da vielleicht in Widerspruch mit irgendwas oder habe ich irgendwo einen nicht existierenden Wert generiert?

Hier nochmal der Quellcode:

Code:
const
  max = 1000000;

var
  Form1: TForm1;
  Werte: Array[1..max] of Integer;
  Anzahl,Zahl: integer;

[...]


procedure TForm1.SelectionSort;
var i,k,maxi,j,wert:integer;
begin
 maxi := high(Werte[i]);
 for i := 0 to maxi - 1 do
  begin
   wert := werte[i];
   k := i;
   for j := i + 1 to maxi do if werte[j] < wert then
    begin
     wert := werte[j];
     k := j;
   end;
  werte[k] := werte[i];
  werte[i] := wert;
  end;
end;
Danke für die Hilfe... autsch...:oops:

Gruß,
thechus

p80286 21. Aug 2012 21:58

AW: Ich weiß nicht, was da falsch ist
 
Delphi-Quellcode:
maxi := high(Werte[i]);
wofür soll das gut sein?

Gruß
K-H

thechus 21. Aug 2012 21:59

AW: Ich weiß nicht, was da falsch ist
 
Hey,

okay ich habe folgendes herausfinden können:
Die Prozedur funktioniert von der Logik her einwandfrei.
Das Problem ist der zugewiesene Wert für "maxi".

Ich muss ihn irgendwie mit den Werten in Verbindung bringen...
Setzte ich die Konstante max auf 100 und weise maxi den Array zu, funktioniert die Prozedur...

Das mal als kleine Zwischennachricht... falls es euch nicht schon längst aufgefallen ist :P

Gruß,
thechus

p80286 21. Aug 2012 22:03

AW: Ich weiß nicht, was da falsch ist
 
Zitat:

Zitat von thechus (Beitrag 1179166)
Ich muss ihn irgendwie mit den Werten in Verbindung bringen...

Dafür gibt es Parameter.

Gruß
K-H

thechus 21. Aug 2012 22:07

AW: Ich weiß nicht, was da falsch ist
 
Code:

procedure TForm1.SelectionSort(var Werte: Array of Integer);
var i,k,maxi,j,wert:integer;
begin
 maxi := high(Werte);
 for i := 0 to maxi - 1 do
  begin
   wert := werte[i];
   k := i;
   for j := i + 1 to maxi do if werte[j] < wert then
    begin
     wert := werte[j];
     k := j;
   end;
  werte[k] := werte[i];
  werte[i] := wert;
  end;
end;

Funktioniert!
DANKE!!! :thumb::thumb::thumb:

Gruß,
thechus

thechus 21. Aug 2012 22:10

AW: Ich weiß nicht, was da falsch ist
 
Nein funktioniert nicht...
Omg was ist denn da passiert...

Der sortiert nur noch lauter Nullen.
Ich muss den Array von der Größe her einfach an den die Menge der Elemente aus Anzahl anpassen oder diese unsortierten Werte direkt auslesen können..
Aber wie??

gott.. mist :pale:

Gruß,
thechus...

Luckie 21. Aug 2012 22:18

AW: Ich weiß nicht, was da falsch ist
 
Ach, da ist noch was falsch: Dein Beitragstitel. Bitte ändere ihn doch so, dass man erkennen kann um was es geht.

thechus 21. Aug 2012 22:21

AW: Selectionsort - Problem mit richtiger Zuweisung der Werte
 
Done

Furtbichler 21. Aug 2012 23:08

AW: Selectionsort - Problem mit richtiger Zuweisung der Werte
 
Nein, nein, nein.

maxi soll... die ANZAHL der Elemente enthalten (-1) !

Wenn also deine Variable 'Anzahl' die Anzahl der Element enthält, die sortiert werden sollen, dann solltest Du... welche Anweisung schreiben?

(Schaffste schon).

thechus 21. Aug 2012 23:19

AW: Selectionsort - Problem mit richtiger Zuweisung der Werte
 
Grr... ich komm nur wage drauf ...
Mein Ansatz wäre sowas wie " maxi := high(werte[anzahl])" aber das scheint auch irgendwie Mist zu sein.

Die Prozedur, die die zufälligen werte ausgibt ist folgende:

Code:
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin
ListBox1.clear;
randomize;
zahl := random(Anzahl);
if combobox1.itemindex = 0 then
begin
 Anzahl:=StrToInt(Edit1.Text);
 randomize;
 for i := 1 to Anzahl do
  begin
   werte[i] := random(Anzahl);
   if i < 500 then
   Listbox1.items.add(inttostr(werte[i]));
  end;
end;
[...]
Ich steh da so richtig auf dem Schlauch grad..
aber danke für deine Geduld.. :thumb: ich brüte weiter.

Gruß,
thechus

thechus 21. Aug 2012 23:26

AW: Selectionsort - Problem mit richtiger Zuweisung der Werte
 
Wolltest du vielleicht auf:

maxi := high(Anzahl);

hinaus?
Anzahl ist ja ein fester Wert (z.b. 100).
Da hätte man für high doch stets 100 raus.
anzahl ist aber nur die Anzahl der Zahlen, die alle einen Wert zwischen 0 und 100 haben können.
Die höchste Zahl kann auch mal 98 sein.

Oh man :pale:

Ich hoffe das war verständlich.
Danke für die Hilfe.

Gruß,
thechus

Uwe Raabe 21. Aug 2012 23:55

AW: Selectionsort - Problem mit richtiger Zuweisung der Werte
 
Dir Funktion High gibt je nach Parameter

a) den höchsten Index eines Arrays
b) den höchsten Wert eines Ordinaltyps
c) die maximale Größe eines ShortStrings

zurück. Wenn die Variable Anzahl ein Integer (= Ordinaltyp) ist, gibt High(Anzahl) den höchsten Wert zurück, den man mit einem Integer darstellen kann. Also verabschiede dich bitte von High.

Deutlicher kann man es kaum sagen:

Zitat:

Zitat von Furtbichler (Beitrag 1179179)
maxi soll... die ANZAHL der Elemente enthalten (-1) !

maxi = <Anzahl der Elemente - 1>

Anzahl = <Anzahl der Elemente>

also lautet die korrekte Zuweisung?

thechus 22. Aug 2012 00:02

AW: Selectionsort - Problem mit richtiger Zuweisung der Werte
 
maxi := Anzahl - 1;

Ich weiß nicht, was ich dazu noch sagen soll.
Es funktioniert :D:D
Vielen Dank für die Hilfe.

Das mit High war irgendwie auch ein Wurm in meinem Kopf...

Super Forum, so spät noch Aktivität.

Gruß,
thechus

himitsu 22. Aug 2012 00:24

AW: Selectionsort - Problem mit richtiger Zuweisung der Werte
 
Und wenn es unbedingt eine Funktion sein soll, dann Delphi-Referenz durchsuchenPred und Delphi-Referenz durchsuchenSucc.

(wobei ich selbs diese komischen dinge nicht so richtig übersichtlich/verständlich empfinde, wenn ich sie in einem Code seh)

Zitat:

Zitat von thechus (Beitrag 1179186)
Das mit High war irgendwie auch ein Wurm in meinem Kopf...

Wobei sich dieses "Problem" durch Nutzung des Debuggers von selbst gezeigt hätte ... hätte man sich darin mal angesehn was der Code macht und welche Werte die Variablen besitzen.

DeddyH 22. Aug 2012 07:42

AW: Selectionsort - Problem mit richtiger Zuweisung der Werte
 
Und wenn man schon High() benutzt, kann man auch Low() benutzen. Zumindest in den ersten Postings wurde das Array immer ab Index 0 durchlaufen, obwohl es bei 1 beginnt, sofern ich mich nicht verlesen habe.

Uwe Raabe 22. Aug 2012 09:52

AW: Selectionsort - Problem mit richtiger Zuweisung der Werte
 
Zitat:

Zitat von DeddyH (Beitrag 1179222)
Und wenn man schon High() benutzt, kann man auch Low() benutzen. Zumindest in den ersten Postings wurde das Array immer ab Index 0 durchlaufen, obwohl es bei 1 beginnt, sofern ich mich nicht verlesen habe.

Good catch :thumb:

DeddyH 22. Aug 2012 12:19

AW: Selectionsort - Problem mit richtiger Zuweisung der Werte
 
Thx :angel2:


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