Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Array sortieren!


mars - Fr 21.02.03 00:21
Titel: Array sortieren!
Guten Tag

Ich hab folgendes Problem: Ich hab ein eindimensionales Array des Record-Typs definiert:

Quelltext
1:
2:
3:
4:
5:
type
  CarRec = record
    name: String;
    length: Integer;
end;

und

Quelltext
1:
Auto = Array[1..1000] of CarRec;                    

und

Quelltext
1:
var MeinAuto: Auto;                    


Nun möchte ich diesen Array nach auto.rec sortieren. Dazu verwende ich den Quicksort-Algorithmus:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure QuickSort(A: Array of CarRec; iLo, iHi: Integer);
  var
    Lo, Hi, Mid: Integer;
  begin
    Lo := iLo;
    Hi := iHi;
    Mid := A[(Lo + Hi) div 2].Height;
    repeat
      while A[Lo].Height < Mid do Inc(Lo);
      while A[Hi].Height > Mid do Dec(Hi);
      if Lo <= Hi then
      begin
        Exchange(A[Lo], A[Hi]);
        Inc(Lo);
        Dec(Hi);
      end;
    until Lo > Hi;
    if Hi > iLo then QuickSort(A, iLo, Hi);
    if Lo < iHi then QuickSort(A, Lo, iHi);
  end;


Nun rufe ich die prozedur folgendermassen auf:

Quelltext
1:
Quicksort(MeinAuto,min,max);                    


Natürlich weiss ich auch, dass es so nicht funktionieren kann, da ja MeinAuto so überhaupt nicht verändert wird. Ich habe aber keine Ahnung, wie das (wahrscheinlich mit Zeigern?) funktionieren soll.

Hat irgendjemand einen Tipp? Ich wäre sehr dankbar...

Danke im Voraus


Udontknow - Fr 21.02.03 10:19

Äh, wieso soll das nicht funktionieren können? Du musst doch tatsächlich einfach nur die Inhalte in der Routine Exchange vertauschen.


Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure Exchange(A,B:CarRec);
var TempAuto:CarRec;
begin
  TempCar:=A;
  A:=B;
  B:=TempCar;
end;


Cu, :)
Udontknow


mars - Fr 21.02.03 11:17

genau so sieht auch meine Prozedur Exchange aus, aber am Array selber verändert sich nichts.
Bist du denn sicher, dass man das nicht mit Zeigern lösen sollte?


smiegel - Fr 21.02.03 11:20

Hallo,

versuche es einmal mit:

procedure QuickSort(var A:Array of CarRec; iLo, iHi: Integer);


mars - Fr 21.02.03 17:25
Titel: SUPER!
@smiegel: Ganz grossen Dank! hat wunderbar geklappt! :D

Ähm, könntest du mir auch noch verraten, weshalb? Ich habe in der Hilfe gesucht, aber nichts zu diesem Thema gefunden...Was macht eine Funktion anders, wenn sie var vor den Parametern hat?


Udontknow - Fr 21.02.03 17:45

Hehe, manchmal sind es eben die kleinen Fehler... :roll:

var bewirkt, das die an die Prozedur oder Funktion übergebene Variable verändert zurückgegeben werden kann.
Ohne var kannst du zwar dein Array verändern (in dem Falle sortieren), sobald aber die Prozedur beendet ist, ist es so, als wäre nichts geschehen.

Cu,
Udontknow


mars - Fr 21.02.03 18:10

aber aus kleinen fehlern lernt man oft sehr viel... :wink:

Thx auf jeden Fall!