AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Selectionsort - Problem mit richtiger Zuweisung der Werte
Thema durchsuchen
Ansicht
Themen-Optionen

Selectionsort - Problem mit richtiger Zuweisung der Werte

Ein Thema von thechus · begonnen am 21. Aug 2012 · letzter Beitrag vom 22. Aug 2012
Antwort Antwort
Seite 1 von 3  1 23      
thechus

Registriert seit: 18. Dez 2011
30 Beiträge
 
#1

Selectionsort - Problem mit richtiger Zuweisung der Werte

  Alt 21. Aug 2012, 21:58
Delphi-Version: 5
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

Geändert von thechus (21. Aug 2012 um 23:21 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.442 Beiträge
 
Delphi 12 Athens
 
#2

AW: Ich weiß nicht, was da falsch ist

  Alt 21. Aug 2012, 22:00
Code:
  Werte: Array[1..max] of Integer;
Welchen Wert hat max?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
thechus

Registriert seit: 18. Dez 2011
30 Beiträge
 
#3

AW: Ich weiß nicht, was da falsch ist

  Alt 21. Aug 2012, 22:01
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
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#4

AW: Ich weiß nicht, was da falsch ist

  Alt 21. Aug 2012, 22:05
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ß.
  Mit Zitat antworten Zitat
thechus

Registriert seit: 18. Dez 2011
30 Beiträge
 
#5

AW: Ich weiß nicht, was da falsch ist

  Alt 21. Aug 2012, 22:12
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

Geändert von thechus (21. Aug 2012 um 22:23 Uhr) Grund: Quelltext erweitert
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.380 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: Ich weiß nicht, was da falsch ist

  Alt 21. Aug 2012, 22:26
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.

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

Registriert seit: 18. Dez 2011
30 Beiträge
 
#7

AW: Ich weiß nicht, was da falsch ist

  Alt 21. Aug 2012, 22:31

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
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#8

AW: Ich weiß nicht, was da falsch ist

  Alt 21. Aug 2012, 22:36
Code:
procedure TForm1.SelectionSort;
...
 maxi := high(Anzahl);
...
Na? Welchen Wert hat maxi nun?
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#9

AW: Ich weiß nicht, was da falsch ist

  Alt 21. Aug 2012, 22:37
Mach aus wert einen Integer. Word ist ohne Vorzeichen, Integer schon. Der Datentyp Word ist eh unsinnig.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
thechus

Registriert seit: 18. Dez 2011
30 Beiträge
 
#10

AW: Ich weiß nicht, was da falsch ist

  Alt 21. Aug 2012, 22:43
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...

Gruß,
thechus
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 06:33 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