AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Dynamische Arrays verhackstückt :(

Ein Thema von glkgereon · begonnen am 6. Feb 2005 · letzter Beitrag vom 7. Feb 2005
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#1

Dynamische Arrays verhackstückt :(

  Alt 6. Feb 2005, 21:00
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???
»Unlösbare Probleme sind in der Regel schwierig...«
  Mit Zitat antworten Zitat
Kernel32.DLL
(Gast)

n/a Beiträge
 
#2

Re: Dynamische Arraye verhackstückt :(

  Alt 6. Feb 2005, 21:09
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]
  Mit Zitat antworten Zitat
Benutzerbild von Sprint
Sprint

Registriert seit: 18. Aug 2004
Ort: Edewecht
712 Beiträge
 
Delphi 5 Professional
 
#3

Re: Dynamische Arraye verhackstückt :(

  Alt 6. Feb 2005, 21:30
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.
Ciao, Sprint.

"I don't know what I am doing, but I am sure I am having fun!"
  Mit Zitat antworten Zitat
Benutzerbild von Binärbaum
Binärbaum

Registriert seit: 19. Jan 2005
Ort: Elstra
764 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Dynamische Arraye verhackstückt :(

  Alt 6. Feb 2005, 23:48
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
There are exactly 10 kinds of people: those who understand binary, and those who don't.
---
"Software reift beim Kunden. Bei Hardware ist es anders: Hardware fault beim Kunden." - Rainer G. Spallek
  Mit Zitat antworten Zitat
Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#5

Re: Dynamische Arraye verhackstückt :(

  Alt 7. Feb 2005, 10:55
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;
»Unlösbare Probleme sind in der Regel schwierig...«
  Mit Zitat antworten Zitat
Benutzerbild von Sanchez
Sanchez

Registriert seit: 24. Apr 2003
Ort: Neumarkt Stmk
892 Beiträge
 
Delphi XE6 Enterprise
 
#6

Re: Dynamische Arrays verhackstückt :(

  Alt 7. Feb 2005, 11:03
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
Daniel
Testen ist feige!
  Mit Zitat antworten Zitat
Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#7

Re: Dynamische Arrays verhackstückt :(

  Alt 7. Feb 2005, 11:28
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;
»Unlösbare Probleme sind in der Regel schwierig...«
  Mit Zitat antworten Zitat
Benutzerbild von Sanchez
Sanchez

Registriert seit: 24. Apr 2003
Ort: Neumarkt Stmk
892 Beiträge
 
Delphi XE6 Enterprise
 
#8

Re: Dynamische Arrays verhackstückt :(

  Alt 7. Feb 2005, 12:01
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.
Daniel
Testen ist feige!
  Mit Zitat antworten Zitat
Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#9

Re: Dynamische Arrays verhackstückt :(

  Alt 7. Feb 2005, 12:04

ich sehs net

kannst du mir nicht die stelle sagen?
»Unlösbare Probleme sind in der Regel schwierig...«
  Mit Zitat antworten Zitat
Benutzerbild von Sanchez
Sanchez

Registriert seit: 24. Apr 2003
Ort: Neumarkt Stmk
892 Beiträge
 
Delphi XE6 Enterprise
 
#10

Re: Dynamische Arrays verhackstückt :(

  Alt 7. Feb 2005, 13:11
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?
Daniel
Testen ist feige!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:39 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