Autor Beitrag
mars
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 238

Debian Woody, Win 2000, Win XP
D7 Ent, Kylix 3
BeitragVerfasst: Fr 21.02.03 00:21 
Guten Tag

Ich hab folgendes Problem: Ich hab ein eindimensionales Array des Record-Typs definiert:
ausblenden Quelltext
1:
2:
3:
4:
5:
type
  CarRec = record
    name: String;
    length: Integer;
end;

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

und
ausblenden Quelltext
1:
var MeinAuto: Auto;					


Nun möchte ich diesen Array nach auto.rec sortieren. Dazu verwende ich den Quicksort-Algorithmus:
ausblenden 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: 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.

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 238

Debian Woody, Win 2000, Win XP
D7 Ent, Kylix 3
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 992
Erhaltene Danke: 1

WIN 7
D7 Prof., C#, RAD XE Prof.
BeitragVerfasst: Fr 21.02.03 11:20 
Hallo,

versuche es einmal mit:

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

_________________
Gruß Smiegel
Ich weiß, daß ich nichts weiß, aber ich weiß mehr als die, die nicht wissen, daß sie nichts wissen. (Sokrates)
mars Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 238

Debian Woody, Win 2000, Win XP
D7 Ent, Kylix 3
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 238

Debian Woody, Win 2000, Win XP
D7 Ent, Kylix 3
BeitragVerfasst: Fr 21.02.03 18:10 
aber aus kleinen fehlern lernt man oft sehr viel... :wink:

Thx auf jeden Fall!