Autor Beitrag
brainm
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Do 15.03.07 00:37 
Ich versuche einen Sortieralgorithmus zu verwenden, der wie folgt aussieht:

ausblenden 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];  //Hier ist das Problem
      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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 629


D7
BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
procedure QSort(l,r: integer; var h: array of THareNiemeyer);					
brainm Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 275

WinXP
BDS 2006
BeitragVerfasst: 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:

ausblenden 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:

ausblenden Delphi-Quelltext
1:
2:
  while (i < Length(H)) and (h[i].Rest < eintrag) do inc(i);
  while (j > 0and (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^^

_________________
erare humanum est
brainm Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: 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.. :-(