Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Dynamische Arrays verhackstückt :( (https://www.delphipraxis.net/39708-dynamische-arrays-verhackstueckt.html)

glkgereon 6. Feb 2005 20:00


Dynamische Arrays verhackstückt :(
 
Delphi-Quellcode:
  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;
so, das is jetzt meine function, nur sehr verkleinert und vom sinn "etwas" verändert...

nur bei dem befehl Result[index]:=i; kommt immer ein fehler der art "Zugriffsverletzung an der Adresse XYZ in Modul WasAuchImmer.

warum???

Kernel32.DLL 6. Feb 2005 20:09

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]

Sprint 6. Feb 2005 20:30

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.

Binärbaum 6. Feb 2005 22:48

Re: Dynamische Arraye verhackstückt :(
 
Zitat:

Zitat von glkgereon
Delphi-Quellcode:
  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;
so, das is jetzt meine function, nur sehr verkleinert und vom sinn "etwas" verändert...

nur bei dem befehl Result[index]:=i; kommt immer ein fehler der art "Zugriffsverletzung an der Adresse XYZ in Modul WasAuchImmer.

warum???

Es sollte so aussehen:
Delphi-Quellcode:
  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;
MfG
Binärbaum

glkgereon 7. Feb 2005 09:55

Re: Dynamische Arraye verhackstückt :(
 
also, es sieht nu so aus:

Delphi-Quellcode:
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;
nu kommt am ende der function eine "Ungültige Zeigeroperation".
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;

Sanchez 7. Feb 2005 10:03

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

glkgereon 7. Feb 2005 10:28

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:
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;
aufruf:
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;

Sanchez 7. Feb 2005 11:01

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.

glkgereon 7. Feb 2005 11:04

Re: Dynamische Arrays verhackstückt :(
 
:gruebel:
ich sehs net :cry:

kannst du mir nicht die stelle sagen?

Sanchez 7. Feb 2005 12:11

Re: Dynamische Arrays verhackstückt :(
 
Hier:
Delphi-Quellcode:
  ...
 //Temp-Array
  SetLength(Temp,MaxVal);
  //Temp nullen
  for i:=0 to MaxVal do Temp[i]:=0;
  ...
oder hier:
Delphi-Quellcode:
  ...
  //Werte schreiben
  for i:=1 to MaxVal do //für alle Zahlen
    for j:=1 to Temp[i] do
  ...
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?


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:17 Uhr.
Seite 1 von 2  1 2      

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