Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Sortieralgorithmus verursacht Zugriffsverletzung (https://www.delphipraxis.net/147201-sortieralgorithmus-verursacht-zugriffsverletzung.html)

Vasco da Gama 3. Feb 2010 16:30


Sortieralgorithmus verursacht Zugriffsverletzung
 
Hallo, ich hoffe ich störe nicht mit meiner (möglicherweise) dummen Frage:

Ich habe folgenden Code zum Sortieren:
Delphi-Quellcode:
procedure SortArray(var AArray: Array of Integer; var BArray: Array of String); overload;
var
  i, j: Integer;
begin
  for j := Length(AArray) downto 1 do
  begin
    for i := 1 to j do
    begin
      if (AArray[i - 1]>AArray[i]) then
      begin
        SwapThings(AArray[i - 1], AArray[i]);
        SwapThings(BArray[i - 1], BArray[i]);
      end;
    end;
  end;
end;
SwapThings ist eine überladene Funktion, nämlich:
Delphi-Quellcode:
procedure SwapThings(var A, B: Integer); overload;
var
  temp: Integer;
begin
  temp := A;
  A := B;
  B := temp;
end;

procedure SwapThings(var A, B: String); overload;
var
  temp: String;
begin
  temp := A;
  A := B;
  B := temp;
end;
SortArray soll also 2 Arrays nach einem davon (dem Integer Array) sortieren.
Also übergebe ich SortArray ein Integer und ein StringArray, die dieselbe Größe haben(ich lasse es mir unmittelbar davor mit showmessage anzeigen)

Beim SortArray erhalte ich aber eine Zugriffsverletzung. Durch gezieltes Auskommentieren konnte ich herausfinden, dass der Fehler irgendwo in der SwapThings procedure liegt (in der mit den Strings)


Aber wo genau liegt denn mein Fehler?
Ich danke allen im Voraus, die sich meines Problems annehmen und entschuldige mich falls mein Fehler trivial ist.

mfG

Helmi 3. Feb 2010 16:40

Re: Sortieralgorithmus verursacht Zugriffsverletzung
 
Hallo,

sollte die erste for-Schleife nicht besser so sein:

Delphi-Quellcode:
for j := high(AArray) downto low(AArray) do
//...
Dynamische Arrays fangen eigentlich immer bei 0 an.
(Low(AArray) liefert den kleinsten Index, könnte also eigentlich auch gleich direkt 0 sein)

p80286 3. Feb 2010 16:47

Re: Sortieralgorithmus verursacht Zugriffsverletzung
 
ich rate mal so ins Blaue hinein, das es gut wäre die Größe des Arrays mit zu übergeben.
(kann mich aber auch irren!)

Gruß
K-H

Uwe Raabe 3. Feb 2010 16:58

Re: Sortieralgorithmus verursacht Zugriffsverletzung
 
In der äußeren Schleife hat j als erstes den Wert Length(AArray) und diesen Wert erreicht I am Ende der inneren Schleife. Length(AArray) ist aber kein gültiger Index mehr.

Schalte mal das RangeCheck ein, dann kommt der Fehler sicher schon früher.

Vasco da Gama 3. Feb 2010 17:05

Re: Sortieralgorithmus verursacht Zugriffsverletzung
 
Danke an euch alle :dp:

Der Tipp von Helmi war richtig, damit klappts wunderbar.

mfG :cheers:

Blup 4. Feb 2010 10:13

Re: Sortieralgorithmus verursacht Zugriffsverletzung
 
Zitat:

Zitat von Helmi
Delphi-Quellcode:
for j := high(AArray) downto low(AArray) do
//...

Mit j = 0 wird die innere Schleife nicht ausgeführt, also besser:
Delphi-Quellcode:
for j := high(AArray) downto 1 do
//...


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:40 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz