Autor Beitrag
anx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: Fr 04.12.09 21:14 
Hallo,
kann mir jemand sagen, warum diese Prozedur bei mir nicht funktioniert. Ich finde einfach den Fehler nicht.
ausblenden volle Höhe Delphi-Quelltext
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..7of 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Fr 04.12.09 22:58 
schon klar, aber der pseudocode in Wikipedia ist ja auf jeden fall richtig, demnach startest du schon mit was 100% richtigem. ;)

user profile iconanx hat folgendes geschrieben Zum zitierten Posting springen:

ausblenden 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;

     }
   }
 }
}

ausblenden 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:=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;



das einzige was mir auf die schnelle auffällt ist, das was ich gehighlightet hab. da verwendest du jeweils unterschiedliche indizes.

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
anx Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Sa 05.12.09 15:40 
user profile iconanx hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: 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 user profile iconNarses: 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!

ausblenden 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 user profile iconNarses: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: 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. :gruebel:

lg elundril

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
Jakob_Ullmann
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: 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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: So 06.12.09 00:12 
user profile iconanx hat folgendes geschrieben Zum zitierten Posting springen:
Eigentlich muss es doch "downto 0" heißen, da das letzte Element 0 ist, oder?
Jupp, dann sollte es stimmen :D .

user profile iconanx hat folgendes geschrieben Zum zitierten Posting springen:
Wie wir gesehen haben, funzt das nicht!
Du hättest lediglich die innere Schleife ein Element früher enden lassen müssen.

user profile iconelundril hat folgendes geschrieben Zum zitierten Posting springen:
wenn i dann bei 0 angekommen ist (0 wird ja noch ausgeführt) und du dann in der innneren schleife i-1 schreibst
Wie oft wird eine for-Schleife von 0 bis -1 wohl ausgeführt ;) ?

_________________
>λ=
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: So 06.12.09 16:19 
:oops: sorry, mein fehler!

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.