![]() |
Arrayzugriff nimmt irgendwelche Wahllos-Variableninhalte aus Speicher
Guten Morgäään, (oh, man ... die halbe Nacht steppe ich nun schon durch diese paar lächerlichen Zeilen dämlichen Code - *rote Augen reib*)
derzeit weiß ich nicht, wie ich das besser beschreiben soll (müde). Ich möchte mit dem SelectionSort Algorithmus mein Array sortieren. Dazu hab ich mir eine zweite "Indexvariable" implemetiert: SortListNumber. Nur diese wird verändert - nicht die ganzen Felderinhalte verschoben. so in ner andern Funktion ist Form1.DynARray[J].SortListNumber fortlaufend, incrementiert (Felder 0 bis 9 sind belegt mit "int" 0 bis 9 ) Doch aus irgendwelchen Gründen tauchen nachher, wenn ich später mal for i := 0 to Form1.MyItemMax - 1 do durch gehe sind manche Zahlen in SortListnumber (immer wieder, reproduzierbar ) 3575 statt 9 oder 24145 statt 4, ... Bsp: 8,5, 7, 3575 , 3, 24145,2 ,0 , 1 , 6. wenn ich die Schleife nochmaldurchgehe werden auch die anderen Ziffern nacheinander durch 24145 ersetzt.... d.h. der holt die wohl irgendwo aus dem Speicher. Aber wo??? Form1.DynARray[i].MyItem;
Delphi-Quellcode:
die Algorithmus-Variablennamen (TMP, hhh, , k) sind leicht abgewandelt von dem Algorithmus, den ich irgendwann mal im Web gefunden jab. Quelle unbkeannt. Aber er müßte mit dem auf Wikipedia gefundenen Pseudocode identisch sein.
procedure TDateienFORM.SORTButtonClick(Sender: TObject);
Var k, tmp, HHH, maxi, i, j, : Integer; begin maxi := Form1.MyItemMax; // verwendete/belegte Felder vom DynArray [0..1000] for i := 0 to maxi - 1 do begin hhh := Form1.DynARray[i].MyItem; // MyItem => zu vergeleichendes Feld k := i; for j := i+ 1 to maxi - 1 do begin // +1 if Form1.DynARray[J].MyItem < hhh then begin k := j; hhh := Form1.DynARray[J].SortListNumber; end; end; Form1.DynARray[k].SortListNumber := Form1.DynARray[i].SortListNumber; Form1.DynARray[i].SortListNumber := hhh; end; end; ![]() Sieht jemand meinen Denkfehler? Danke - entschuldigt bitte meine Problem-Beschreibung. Bin noch Delphi-newbie. |
AW: Arrayzugriff nimmt irgendwelche Wahllos-Variableninhalte aus Speicher
Was mir beim drüberlesen auffällt ist, dass du, wenn kein Eintrag gefunden wird, HHH aus Form1.DynARray[i].MyItem befüllst, es aber in Form1.DynARray[i].SortListNumber reinschreibst.
|
AW: Arrayzugriff nimmt irgendwelche Wahllos-Variableninhalte aus Speicher
Deine Variable hhh stellt einmal den Wert des Elementes, einmal die Sortierreihenfolge dar. Das solltest du dir nochmal näher anschauen, am besten unterschiedliche Variablen verwenden.
|
AW: Arrayzugriff nimmt irgendwelche Wahllos-Variableninhalte aus Speicher
Zitat:
|
AW: Arrayzugriff nimmt irgendwelche Wahllos-Variableninhalte aus Speicher
Zum Problem wurde ja schon Einiges gesagt, also nun noch was zum Design:
Du verwendest in dieser Methode ausschließlich Variablen von Form1. Warum ist liegt dieser Code also nicht in einer "Sortier"-Methode von Form1, welche über SORTButtonClick aufgerufen wird? |
AW: Arrayzugriff nimmt irgendwelche Wahllos-Variableninhalte aus Speicher
Wem ist denn der Fehler in dem Wikipedia-Code aufgefallen? ;)
|
AW: Arrayzugriff nimmt irgendwelche Wahllos-Variableninhalte aus Speicher
?
1. Wiki hat immer Recht. 2. Sollte sie nicht Recht haben, dann gilt Punkt 1. 3. Im Zweifel fragt man den G. und der sagt Wiki habe Recht. |
AW: Arrayzugriff nimmt irgendwelche Wahllos-Variableninhalte aus Speicher
Wenn wir den Wikipedia-Pseudeo-Code mal nach Delphi übersetzen (das geht quasi 1:1, denn das riecht nach gedeutschtem Pascal)
Code:
in Delphi (aber falsch)
prozedur SelectionSort( A : Liste sortierbarer Elemente )
n = Länge( A ) links = 0 wiederhole min = links für jedes i von links + 1 bis n wiederhole falls A[ i ] < A[ min ] dann min = i ende falls ende für Vertausche A[ min ] und A[ links ] links = links + 1 solange links < n prozedur ende
Delphi-Quellcode:
und nun mal richtig
procedure SelectionSort( var A : TArray<Integer> );
var n, i, links, min : Integer; temp : Integer; begin n := Length( A ); links := 0; // soso, das erste Element hat den Index 0 :o) repeat min := links; for i := links + 1 to n do begin if A[ i ] < A[ min ] then min := i: end; temp := A[ links ]; A[ links ] := A[ min ]; A[ min ] := temp; links := links + 1; until not( links < n ); end;
Delphi-Quellcode:
procedure SelectionSort( var A : TArray<Integer> );
var n, i, links, min : Integer; temp : Integer; begin n := High( A ); links := Low( A ); while links < n do begin min := links; for i := links + 1 to n do begin if A[ i ] < A[ min ] then min := i: end; if links <> min then begin temp := A[ links ]; A[ links ] := A[ min ]; A[ min ] := temp; end; links := links + 1; end; end; |
AW: Arrayzugriff nimmt irgendwelche Wahllos-Variableninhalte aus Speicher
Gut, die Schleife ist falschrum, aber solange die Liste nicht leer ist, knallt es auch nicht. :stupid:
Und das fehlende
Delphi-Quellcode:
... sich selber mit sich austauschen ist zwar sinnlos, aber zumindestens nicht falsch. :angle:
if links <> min then
|
AW: Arrayzugriff nimmt irgendwelche Wahllos-Variableninhalte aus Speicher
Zitat:
Bei 6 Elementen bekomme ich als Länge 6 zurück. Die Elemente spreche ich aber über 0..5 an und genau da liegt der Fehler in dem Pseudo-Code, der greift auch auf den Index 6 zu, was das 7. Element wäre, was es gar nicht gibt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:42 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz