Autor |
Beitrag |
anx
      
Beiträge: 16
|
Verfasst: Fr 04.12.09 21:14
Hallo,
kann mir jemand sagen, warum diese Prozedur bei mir nicht funktioniert. Ich finde einfach den Fehler nicht. 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45:
| var Form1: TForm1; arr:array[0..7] of integer; size:integer;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); var i:integer; begin randomize(); size:=8; for i:=0 to 7 do arr[i]:=random(50); end;
procedure BubbleSort(); var i,j,swp:integer; begin for i:=0 to size-1 do begin for j:=0 to size-i-1 do begin if arr[j+1] < arr[j] then begin swp:=arr[j+1]; arr[j+1]:=arr[j]; arr[j]:=swp; end; end; end; end;
procedure TForm1.Button1Click(Sender: TObject); var i:integer; begin Label1.Caption:=''; BubbleSort(); for i:=0 to 7 do Label1.Caption:=Label1.Caption + IntToStr(arr[i]) + ' '; end;
end. |
Vielen Dank
anx
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Fr 04.12.09 21:32
weil dein code vollkommen anders aussieht als der Pseudocode von wikipedia aussieht? Ich würd dir mal raten das du den versuchst möglichst 1 zu 1 umzusetzen und dann schaust ob du vielleicht schleifentypen austauschen kannst usw.
lg elundril
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
anx 
      
Beiträge: 16
|
Verfasst: Fr 04.12.09 22:53
Hallo,
was ist denn das für eine Begründung? Wikipedia ist nicht das universelle Vorbild  . Ich habe nämlich den C++ Code einfach übersetzt und wundere mich warum es in Delphi nicht funktioniert. Falls es jemandem hilft. So sieht der C++ Code aus:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| void BubbleSort() { for(int i=0; i<size;i++) { for(int j=0; j<size-i;j++) { if (arr[j+1]<arr[j]) { int swp = arr[j]; arr[j]=arr[j+1]; arr[j+1]=swp; } } } } |
Könnt ihr mir helfen?
Vielen Dank
lg, anx
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Fr 04.12.09 22:58
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
anx 
      
Beiträge: 16
|
Verfasst: Fr 04.12.09 23:08
ja, aber wie man sieht ist das das komplett gleiche! In C++ funktioniert es, aber hier....hä? Bitte helft mir weiter!
Vielen, vielen Dank
lg, anx
PS.: "Size" sollte nicht in der FormCreate Methode stehen, doch auch bei Verbesserung hilft das gar nichts! Delphi ist irgendwie komisch  (auch wenn bekannt ist, dass der Dumme immer vor dem Bildschirm sitzt).
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Fr 04.12.09 23:30
Viel spass mit Christian's Crashkurs und dem Delphi-Wikibook. Der Debugger kann dir vielleicht helfen.
was mir nur auffällt: in der ersten runde, wenn i=0 ist greifst du im letzten durchgang der inneren schleife auf ein Element zu das "dir ned gehört". Vielleicht kommt deswegen nix gscheids raus.
lg elundril
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
anx 
      
Beiträge: 16
|
Verfasst: Fr 04.12.09 23:44
Sicher, dass ich da auf ein solches ELement zugreife? Ich sehe das irgendwie nicht. Ich glaube nicht, dass hier ein Debugger hilft. Ich mache ja irgendeinen Übersetzungsfehler von C++ nach Delphi, doch finde ich diesen nicht!
VIelen Dank für die Hilfe
lg, anx
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Fr 04.12.09 23:48
size-i-1 = 8-0-1 = 7 = oberstes element in deinem array
wenn du jetzt j + 1 rechnest dann hast du 7+1=8= größer als der index des obersten elements.
und der debugger hilft insofern das du genau siehst wie welche elemente verschoben werden und auch siehst was du ev. falsch machst. 
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
anx 
      
Beiträge: 16
|
Verfasst: Sa 05.12.09 15:23
Nein, das stimmt nicht. size-i-1 ist die Obergrenze der Schleife und nicht j. j geht nur bis dahin und steigt ab 0 auf. Da es eben immer kleiner als size ist, wird auch auf kein nicht vorhandenes Objekt zugegriffen.
Ich finde einfach den Fehler nicht. Ich habe es doch eins zu eins aus C++ übernommen und dort funktioniert es.
Vielen Dank für die Hilfe und bitte helft weiter
lg, anx
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Sa 05.12.09 15:40
anx hat folgendes geschrieben : | Da es eben immer kleiner als size ist, wird auch auf kein nicht vorhandenes Objekt zugegriffen. |
Eben: j ist immer kleiner als size, j+1 allerdings nicht.
_________________ >λ=
|
|
anx 
      
Beiträge: 16
|
Verfasst: Sa 05.12.09 15:47
Achso...könntet ihr vielleicht meinen Code irgendwie verbessern, denn ich weiß einfach nicht weiter. ICh habe das jetzt ausprobiert aber es bringt nichts. Das wäre lieb!
Vielen Dank
lg, anx
--- Moderiert von Narses: Beiträge zusammengefasst---
Ich habs hinbekommen, indem ich mir noch ein paar Beispiele angeguckt habe. Wahrscheinlich ist das der Grund warum die eine Schleife immer andersherum als die andere geht. Ich habe das nämlich erst nicht eingesehen und es wie oben versucht. Wie wir gesehen haben, funzt das nicht!
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| procedure BubbleSort(); var i,j,swp:integer; begin for i:=size-1 downto 1 do begin for j:=0 to i-1 do begin if (arr[j+1]<arr[j]) then begin swp:=arr[j]; arr[j]:=arr[j+1]; arr[j+1]:=swp; end; end; end; end; |
Vielen Dank
lg, anx
--- Moderiert von Narses: Beiträge zusammengefasst---
Ich habe doch noch eine Frage. Eigentlich muss es doch "downto 0" heißen, da das letzte Element 0 ist, oder? Ich habe ja das Array folgendermaßen deklariert:
arr:array[0..7] of integer;
Vielen Dank
lg, anx
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Sa 05.12.09 16:27
wenn du jetzt downto 0 schreibst hast du das selbe problem wie oben. wenn i dann bei 0 angekommen ist (0 wird ja noch ausgeführt) und du dann in der innneren schleife i-1 schreibst bist du ja irgendwann beim index -1 und index -1 ist n fehler.
Sowas sollte es doch auch in C++ geben, das man nicht auf Felder von nem Array zugreifen darf die gar ned existieren.
lg elundril
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
Jakob_Ullmann
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: Sa 05.12.09 16:33
Also 1.: Es gibt hier eine Editierfunktion.
2.: Warum versuchst du denn nicht, den Wikipedia-Code umzusetzen? Würde ich eher machen, als eine C++ nach Delphi Übersetzung zu starten.
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| prozedur bubbleSort( A : Liste sortierbarer Elemente ) n := Länge( A ) wiederhole vertauscht := falsch für jedes i von 1 bis n - 1 wiederhole falls A[ i ] > A[ i + 1 ] dann vertausche( A[ i ], A[ i + 1 ] ) vertauscht := wahr ende falls ende für n := n - 1 solange vertauscht und n >= 1 prozedur ende |
die Konstruktion für jedes (...) wdh. solange (...) kannst du sowohl mit for als auch mit repeat-until umsetzen.
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: So 06.12.09 00:12
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: So 06.12.09 16:19
 sorry, mein fehler!
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|