Hilfe bei qsort() nötig!
-
Hallo,
ich habe ein Problem mit qsort().
Es wird zwar irgendetwas sortiert, aber nicht so wie ich will...Hier der Ausschnitt, in dem qsort() aufgerufen wird:
... int Job int TransferJob[5][250]; // enthält die Nummer der Vorgänge, für die eine Verbindung nach "Job" möglich ist int AnzJobs[5]; // enthält die Anzahl der Vorgänge, für die eine Verbindung nach "Job" möglich ist //(entspricht also Anzahl relevanter Elemente von TransferJob) int jobnumber; int resourcenumber2; ... jobnumber=Job; for(j=1;j<=r;j++) { resourcenumber2=j; qsort(TransferJob[j], AnzJobs[j], sizeof(int), compareTT); }
Die zugehörige CompareTT-Funktion lautet wie folgt:
... int TT[5][250][250]; // enthält pro Ressource Kosten der Verbindung Vorgang i nach Vorgang j int activityRes[5][250]; ... int compareTT(const void *j1, const void *j2) { if(TT[resourcenumber2][TransferJob[resourcenumber2][* (int *)j1]][jobnumber] == TT[resourcenumber2][TransferJob[resourcenumber2][* (int *)j2]][jobnumber]) return activityRes[resourcenumber2][* (int *)j2][0]-activityRes[resourcenumber2][* (int *)j1][0]; // als Tie-Breaker else return (TT[resourcenumber2][TransferJob[resourcenumber2][* (int *)j1]][jobnumber] - TT[resourcenumber2][TransferJob[resourcenumber2][* (int *)j2]][jobnumber]); }
Und ich möchte gern in TransferJob[j] die Vorgänge in der Reihenfolge steigender Kosten für eine Verbindung vom betreffenden Vorgang zu Vorgang "Job" stehen haben.
Und das funktioniert nicht. Es wird zwar sortiert. Ich kann aber nicht im geringsten erkennen, was gemacht wurde.Kann mit jemand helfen, wo mein Fehler liegt?
Vielen, vielen Dank.
Doreen
-
eine grosse hilfe waere es, wenn du deine compareTT funktion aufraeumen und auseinanderziehen wuerdest: benutz variablen fuer die werte, auf die du zugreifst.
-
Hallo,
vielen Dank für den Tipp. Habe ich gemacht. Aber es funktioniert immer noch nicht... und ich kann nicht sehen, woran es liegt.
Ich bin langsam am verzweifeln.Hier die neuen Varaiblen:
int Job int TransferJob[5][250]; // enthält die Nummer der Vorgänge, für die eine Verbindung nach "Job" möglich ist int AnzJobs[5]; // enthält die Anzahl der Vorgänge, für die eine Verbindung nach "Job" möglich ist //(entspricht also Anzahl relevanter Elemente von TransferJob) int TTsort[5][250]; // enthält Kosten für Verbindung von Vorgang j zu "Job" int r; int activityRes[5][250]; ...
Hier die vereinfachte "compare"-Funktion:
int compareTT(const void *j1, const void *j2) { if(TTsort[r][* (int *)j1] == TTsort[r][* (int *)j2]) return activityRes[r][* (int *)j2][0] - activityRes[r][* (int *)j1][0]; else return (TTsort[r][* (int *)j1] - TTsort[r][* (int *)j2]); }
... und qsort():
for(j=1;j<=r;j++) { r=j; for(i=0;i<=AnzJobs[j]-1;i++) TTsort[j][i]=TT[j][TransferJob[j][i]][Job]; qsort(TransferJob[j], AnzJobs[j], sizeof(int), compareTT); }
Kann jemand sehen, woran es liegt, dass qsort, nicht die "richtige" Sortierung ausspuckt?
Ich wäre für jeden Hinweis dankbar.Vielleicht hilft ja noch der Code für "TransferJob":
for(j=1;j<=r;j++) if((Endzeit_F[i]<=Startzeit_F[Job]) && (activityRes[j][i][0]>0 || activityRes[j][i][1]>0)) { AnzJobs[j]++; TransferJob[j][AnzJobs[j]-1]=i; }
Doreen
-
zeig doch mal, was beim sortieren rauskommt. vll erkennt man ja DARAN was...
-
... vor dem Sortieren enthält TransferJob diese Reihenfolge
TransferJob 0x00c5ea78 int (* TransferJob)[255] int [5][255]
[0] 0x00c5ea78 int (* TransferJob)[255] int [255]
[1] 0x00c5ee74 int [255]
[0] 1 int
[1] 3 int
[2] 5 int
[3] 11 int
[4] 12 int
[5] 20 int
[6] 29 intDie Kosten nach denen sortiert werden sollen sehen wie folgt aus:
TTsort 0x00c5ada8 int (* TTsort)[255] int [5][255]
[0] 0x00c5ada8 int (* TTsort)[255] int [255]
[1] 0x00c5b1a4 int [255]
[0] 0 int
[1] 5 int
[2] 5 int
[3] 0 int
[4] 0 int
[5] 6 int
[6] 2 intAnzJobs ist 7.
Richtige Reihenfolge wäre demnach (meiner Meinung nach):
TransferJob
[0] 1 int
[1] 11 int
[2] 12 int
[3] 29 int
[4] 3 int
[5] 5 int
[6] 20 intBei gleichen Kosten soll der Tie-Breaker helfen, um diese eindeutige Reihenfolge herzustellen.
Mein Debugger spuckt jedoch dies aus:TransferJob
[0] 3 int
[1] 11 int
[2] 12 int
[3] 20 int
[4] 29 int
[5] 1 int
[6] 5 intSelbst, wenn es die falsche Sortierrichtung sein sollte, kann es nicht stimmen.
Kannst du was erkennen?
Vielen Dank.
Doreen
-
am output kann ich nichts erkennen. jedoch wuerde ich an deiner stelle evtl die vergleichsfunktion neu anfangen, also die alte einfach loeschen (nicht nur auskommentieren) und bevor du sie neu schreibst, einmal in den park gehen, ne runde schwimmen, ins kino gehen oder einfach ne nacht drueber schlafen.
du koenntest aber auch die cmp funktion mit printf spicken und dir die parameter samt vorgesehenem rueckgabewert ausgeben lassen.
-
c.rackwitz schrieb:
am output kann ich nichts erkennen. jedoch wuerde ich an deiner stelle evtl die vergleichsfunktion neu anfangen, also die alte einfach loeschen (nicht nur auskommentieren) und bevor du sie neu schreibst, einmal in den park gehen, ne runde schwimmen, ins kino gehen oder einfach ne nacht drueber schlafen.
... werde ich dann wohl mal machen. bin schon ganz wirr im Kopf vom auf die Funktion schauen und testen.
c.rackwitz schrieb:
a
du koenntest aber auch die cmp funktion mit printf spicken und dir die parameter samt vorgesehenem rueckgabewert ausgeben lassen.... super Idee. Ist gleich das erste, was ich morgen früh machen werde. Natürlich erst nach einem Kaffee. Danke.
-
Ok. Dein Tip mit der fprint-Ausgabe hat geholfen. Jetzt funktionierts.
Ich danke dir.