![]() |
Dynamische Arrays verhackstückt :(
Delphi-Quellcode:
so, das is jetzt meine function, nur sehr verkleinert und vom sinn "etwas" verändert...
TIntDynArray = array of Integer;
function Test(Values: TIntDynArray; Len: Integer):TIntDynArray; var i, index:integer; begin for i:=1 to Len do begin inc(index); Result[index]:=i; end; end; nur bei dem befehl Result[index]:=i; kommt immer ein fehler der art "Zugriffsverletzung an der Adresse XYZ in Modul WasAuchImmer. warum??? |
Re: Dynamische Arraye verhackstückt :(
weise index den Wert "0" am Anfang deiner Routine zu. Sonst beginnt er mit dem Hochzählen bei 1000017 oder sonst wo. (Weiß nicht, ob das des Rätsels Lösung ist, ist mir nur aufgefallen)
****************** [Klugscheißmodus] Die Mehrzahl von "Array" ist "Arrays", nicht "Arraye" [/Klugscheißmodus] |
Re: Dynamische Arraye verhackstückt :(
Der Rückgabewert deiner Funktion ist ein dynamisches Array. Bevor du da mit Result[Index] draufzugreifen kannst, musst du auch erstmal mit SetLength Speicher für dieses Array anlegen. Index ist eine lokale Variable und muss vor dem ersten Aufruf mit Inc initialisiert werden. Also vor der For-Schleife einmal Index := 0 schreiben.
|
Re: Dynamische Arraye verhackstückt :(
Zitat:
Delphi-Quellcode:
MfG
TIntDynArray = array of Integer;
function Test(Values: TIntDynArray; Len: Integer):TIntDynArray; var i, index:integer; begin index:=0; SetLength(Result, Len); for i:=1 to Len do begin inc(index); Result[index]:=i; end; end; Binärbaum |
Re: Dynamische Arraye verhackstückt :(
also, es sieht nu so aus:
Delphi-Quellcode:
nu kommt am ende der function eine "Ungültige Zeigeroperation".
function Test(Values: TIntDynArray; Len: Integer):TIntDynArray;
var i, index:integer; begin SetLength(Result,Len); index:=0; for i:=1 to Len do begin inc(index); Result[index]:=i; end; end; hier der aufruf:
Delphi-Quellcode:
var temp:TIntDynArray;
begin SetLength(temp,ListBox1.Count); for i:=0 to ListBox1.Count-1 do temp[i+1]:=strtoint(ListBox1.Items[i]); temp:=test(temp,length(temp)); for i:=0 to ListBox1.Count-1 do ListBox2.Items.Add(inttostr(temp[i+1])); end; |
Re: Dynamische Arrays verhackstückt :(
Hallo,
Vertausch mal die Reihenfolge von inc(index) und Result[index]:=i. Du marschierst übers Array hinaus. Dynamische Arrays gehen immer von 0 bis Length-1. grüße, daniel |
Re: Dynamische Arrays verhackstückt :(
ok, es funzt jetzt....
nun die nächste procedure und das nächste problem diese procedure soll eigentlich sortieren, ob das sortieren funzt is aber (noch) nicht das thema und wieder kommt ganz am ende eine AV
Delphi-Quellcode:
aufruf:
procedure Sort(var Values: TIntDynArray; Len: Integer);
var MaxVal, i, j, index:Integer; Temp:TIntDynArray; begin MaxVal:=0; //MaxValue for i:=0 to Len do if MaxVal<Values[i] then MaxVal:=Values[i]; //Temp-Array SetLength(Temp,MaxVal); //Temp nullen for i:=0 to MaxVal do Temp[i]:=0; //Werte holen for i:=0 to Len do Temp[Values[i]]:=Temp[Values[i]]+1; index:=0; //Werte schreiben for i:=1 to MaxVal do //für alle Zahlen for j:=1 to Temp[i] do begin Values[index]:=i; //schreiben inc(index); //index erhöhen end; SetLength(Temp,0); //Temp leeren end;
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var temp:TIntDynArray; i:integer; begin ListBox2.Clear; SetLength(temp,ListBox1.Count-1); for i:=0 to ListBox1.Count-1 do temp[i]:=strtoint(ListBox1.Items[i]); sort(temp,length(temp)-1); for i:=0 to ListBox1.Count-1 do ListBox2.Items.Add(inttostr(temp[i])); end; |
Re: Dynamische Arrays verhackstückt :(
Lies nochmal was ich vorher geschrieben habe. Ein dynamisches Array geht von 0 bis Length(Array) - 1. Und jetzt schau dir deinen Code nochmals an.
|
Re: Dynamische Arrays verhackstückt :(
:gruebel:
ich sehs net :cry: kannst du mir nicht die stelle sagen? |
Re: Dynamische Arrays verhackstückt :(
Hier:
Delphi-Quellcode:
oder hier:
...
//Temp-Array SetLength(Temp,MaxVal); //Temp nullen for i:=0 to MaxVal do Temp[i]:=0; ...
Delphi-Quellcode:
Außerdem versteh ich dein rumgepfriemel mit der index-Variable nicht. Warum lässt du nicht einfach den Zähler von 0 bis länge-1 laufen?
...
//Werte schreiben for i:=1 to MaxVal do //für alle Zahlen for j:=1 to Temp[i] do ... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:17 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-2025 by Thomas Breitkreuz