Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Typenproblem
brainm - Do 15.03.07 00:37
Titel: Typenproblem
Ich versuche einen Sortieralgorithmus zu verwenden, der wie folgt aussieht:
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:
| procedure QSort(l,r: integer; var h: ThnArray); var i,j: byte; eintrag: integer; hilfe: THareNiemeyer; begin i := l; j := r; eintrag := h[(l+r) div 2].Rest; repeat while (h[i].Rest < eintrag) do inc(i); while eintrag < h[j].Rest do dec(j); if i <= j then begin hilfe := h[i]; h[i] := h[j]; h[j] := hilfe; inc(i); dec(j); end; until i>j;
if l<j then QSort(l,j,h); if r>i then QSort(i,r,h); end; |
THNarray ist definiert als array of THareNiemeyer. Das im konkreten Fall übergebene Array ist dynamisch (vermutlich ist das die Ursache für das Problem). THareNiemeyer ist ein Record mit einem string, einem real und 2 integer-Werten.
An der bezeichneten Stelle versuche ich, zwei Records innerhalb des Arrays auszutauschen. Dazu habe ich mir gedacht, ich lege die Variable hilfe an, welche ja vom gleichen Typ ist wie die einzelnen Elemente des Arrays (theoretisch). Die Zuweisungsreihenfolge erklärt sich wohl selbst.
Nachdem ich mehrfach Laufzeitfehler hatte (AccessViolation und ungültige Zeigeroperation) habe ich mal testweise ein "if hilfe = h[i]" eingefügt. Dann meckert aber der Compiler, die beiden Typen wären inkompatibel. Sogar "if h[j] = h[i]" geht nicht. Aber offensichtlich sind sie ja zumindestens zuweisungskompatibel, denn da hat er ja klaglos übersetzt.
Ich wüsste nun gern, von welchem Typ diese Elemente im (dynamischen) Array wirklich sind und warum sie nichtmal untereinander verglichen werden können...
IngoD7 - Do 15.03.07 11:49
Bei dem Elend habe ich auch immer wieder meine Schwierigkeiten. Erklären/beantworten kann ich dir deine Fragen so auf die Schnelle nicht.
Schnellschuss - versuche es mal so, ob es da dasselbe ist:
Delphi-Quelltext
1:
| procedure QSort(l,r: integer; var h: array of THareNiemeyer); |
brainm - Do 15.03.07 11:53
Das war meine vorherige Variante :-) Habe es extra so geändert wie es jetzt ist, um zu sehen, ob es dann funktioniert... Eine Variante wäre sicherlich, alle Elemente des Records einzeln zu kopieren, aber das ist ja eigentlich unnötiger Aufwand... Das Problem ist, dass ich mich mit den ganzen Zeigergeschichten bei DynArrays nicht so wirklich auskenne. Ich weiß zwar, dass ich Copy benutzen muss, wenn es um ein ganzes Array geht, aber wie das mit den einzelnen Elementen aussieht hab ich keine Ahnung.
Robinator - Do 15.03.07 12:43
Hi,
Das Array als Open-Array Parameter zu übergeben ist definitiv keine gute idee, das ist so schon besser ;)
Ich vermute mal gaaanz stark, dass der Fehler hier liegt:
Delphi-Quelltext
1: 2:
| while (h[i].Rest < eintrag) do inc(i); while eintrag < h[j].Rest do dec(j); |
Du überprüfst nicht, ob sich i und j im Gültigen Bereich befinden [0..High(H)]. Versuch es mal so:
Delphi-Quelltext
1: 2:
| while (i < Length(H)) and (h[i].Rest < eintrag) do inc(i); while (j > 0) and (eintrag < h[j].Rest) do dec(j); |
Vielleicht hilft das ja. Gruss, rob
//EDIT: Ich bin mir doch nicht mehr ganz so sicher, dass der Fehler da liegt^^
brainm - Do 15.03.07 16:33
Ich glaube auch nicht, dass da das Problem liegt... :-)
Der Witz ist ja, dass zwei Elemente zuweisungskompatibel sind, aber nicht z.B. mit "if (h[i] = h[j]) verglichen werden können. Das grenzt ja die möglichen Ursachen schon etwas ein, oder? Wäre echt super wenn mir da mal jemand auf die Sprünge helfen könnte oder ne Alternativlösung vorschlagen.. :-(
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!