Autor |
Beitrag |
mars
      
Beiträge: 238
Debian Woody, Win 2000, Win XP
D7 Ent, Kylix 3
|
Verfasst: Fr 21.02.03 00:21
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
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
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: 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 
      
Beiträge: 238
Debian Woody, Win 2000, Win XP
D7 Ent, Kylix 3
|
Verfasst: 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
      
Beiträge: 992
Erhaltene Danke: 1
WIN 7
D7 Prof., C#, RAD XE Prof.
|
Verfasst: 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 
      
Beiträge: 238
Debian Woody, Win 2000, Win XP
D7 Ent, Kylix 3
|
Verfasst: Fr 21.02.03 17:25
Titel: SUPER!
@smiegel: Ganz grossen Dank! hat wunderbar geklappt!
Ä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
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Fr 21.02.03 17:45
Hehe, manchmal sind es eben die kleinen Fehler...
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 
      
Beiträge: 238
Debian Woody, Win 2000, Win XP
D7 Ent, Kylix 3
|
Verfasst: Fr 21.02.03 18:10
aber aus kleinen fehlern lernt man oft sehr viel...
Thx auf jeden Fall!
|
|
|