Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Fehler: Ungültige Zeigeroperation


`shay´ - Sa 21.02.04 01:11
Titel: Fehler: Ungültige Zeigeroperation
Hallo!

Ich bin gerade dabei ein Programm für Sortieralgorithmen zu schreiben, an sich ja kein Problem.
Ich möchte das die Zahlen in eine Listbox eingegeben werden, dann zum Sortieren in Arrays umgewandelt und danach in einer zweiten Listbox wieder ausgegeben werden. Das funktioniert zwar aber es kommt immer die Fehlermeldung
Ungültige Zeigeroperation! Ich kann damit leider gar nix anfangen. Habe zwar in der Delphi Hilfe danach gesucht aber das bringt mir auch nichts.

Hier noch der Quelltext:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Zahlen: TGroupBox;
    Zahlenliste: TListBox;
    add: TButton;
    delete: TButton;
    deleteall: TButton;
    save: TButton;
    load: TButton;

    Eingabe: TEdit;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    GroupBox1: TGroupBox;
    Button1: TButton;
    Zahlenliste2: TListBox;
    procedure addClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure deleteClick(Sender: TObject);
    procedure deleteallClick(Sender: TObject);
    procedure saveClick(Sender: TObject);
    procedure loadClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  Zahlenliste: TListBox;
  zahl: array of integer;


implementation

{$R *.dfm}

procedure Tausche (x,y: integer);
   var dummy: integer;
begin
   dummy:= zahl[x];
   zahl[x]:= zahl[y];
   zahl[y]:= dummy;
end;

procedure TForm1.addClick(Sender: TObject);
begin
   Zahlenliste.Items.Add(Eingabe.Text);
   Eingabe.Clear;
   Form1.ActiveControl:=Eingabe;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
   Form1.ActiveControl:=Eingabe;
end;

procedure TForm1.deleteClick(Sender: TObject);
begin
   Zahlenliste.Items.Delete(Zahlenliste.ItemIndex);
end;

procedure TForm1.deleteallClick(Sender: TObject);
begin
   Zahlenliste.Clear;
end;

procedure TForm1.saveClick(Sender: TObject);
begin
   SaveDialog1.Execute;
   Zahlenliste.Items.SaveToFile (SaveDialog1.FileName);
end;

procedure TForm1.loadClick(Sender: TObject);
begin
   OpenDialog1.Execute;
   Zahlenliste.Items.LoadFromFile(OpenDialog1.Filename);
end;

procedure TForm1.Button1Click(Sender: TObject);
   var i,j,k : integer;
begin
   k:= Zahlenliste.Items.Count;
   SetLength (zahl,k);
   for i:=1 to Zahlenliste.Items.Count do
      begin
      zahl[i]:= StrToInt (Zahlenliste.Items[i-1]);
      end;

   for i:= 1 to k-1 do
      for j:= i+1 to k do
         if zahl[i]>zahl[j] then Tausche (i,j);

   for i:=1 to k do
   Zahlenliste2.Items.Add(IntToStr(zahl[l]));
end;

end.


Im Vorraus besten Dank!

`shay´

EDIT: Verschiebt mich bitte wenn ich hier nit richtig sein sollte habe gerade nit drauf geachtet :(

Moderiert von user profile iconPeter Lustig: Code- durch Delphi-Tags ersetzt


Delete - Sa 21.02.04 01:35

So auf den ersten Blick:

Was soll das:

Delphi-Quelltext
1:
2:
3:
4:
5:
type 
  TForm1 = class(TForm) 
    ...;
    Zahlenliste: TListBox; 
    ...;

Und dann hier noch mal:

Delphi-Quelltext
1:
2:
3:
var 
  ...;
  Zahlenliste: TListBox;


Und hier klingeln bei mir die kleinen Alarmglöckchen:

Delphi-Quelltext
1:
for i:=1 to Zahlenliste.Items.Count do                    

Das erste Item hat den Index 0 demnach muss deine Schleife von 0 bis Count-1 laufen.


`shay´ - Sa 21.02.04 10:48

Also die Typ Deklaration ist von Delphi selbst gemacht, die var Deklaration habe ich noch eingefügt weil es sonst im Programm die Variable Zahlenliste nicht kennt.

Deine Alarmglöckchen klingeln bei mir nicht weil ich dachte ich hätte das innerhalb der Schleife noch gelöst

Delphi-Quelltext
1:
2:
3:
4:
 for i:=1 to Zahlenliste.Items.Count do 
      begin 
      zahl[i]:= StrToInt (Zahlenliste.Items[i-1]); 
      end;


Ich habe es aber mal so umgeändert wie du meinst und die Fehlermeldung kommt immer noch. :(

Moderiert von user profile iconPeter Lustig: Code- durch Delphi-Tags ersetzt


Keldorn - Sa 21.02.04 10:51

Hallo

zudem was Luckie gesagt hat: hier sind noch einige Fehler drin:
beim laden/Speichern:

Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.saveClick(Sender: TObject);
begin
   SaveDialog1.Execute;
   Zahlenliste.Items.SaveToFile (SaveDialog1.FileName);
end;


heißt besser:

Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.saveClick(Sender: TObject);
begin
   if SaveDialog1.Execute then
     Zahlenliste.Items.SaveToFile (SaveDialog1.FileName);
end;

du würdest immer laden und speichern, egal ob der user auf abbrechen oder ok geklickt hat. Gugg dir die Sachen, die du verwendest, in der Onlinehilfe an, zu vielen ist ein Beispiel hinterlegt.

dein Fehler sollte hier entstehen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.Button1Click(Sender: TObject);
   var i,j,k : integer;
begin
   k:= Zahlenliste.Items.Count;
   SetLength (zahl,k);
   for i:=1 to Zahlenliste.Items.Count do
      begin
      zahl[i]:= StrToInt (Zahlenliste.Items[i-1]);
      end;

setlenght(zahl,k): auch ein dynamisches array beginnt bei 0 zu zählen, da du von 1 beginnst zu zählen, bis du mit dem letztem Eintrag außerhalb des gültigen Bereichs. Beim Schreiben mags noch gehen, beim auslesen kracht es dann spätestens. In der tutorial-sparte ist auch ein Eintrag von Peter Lustig zum Thema array, lies dir das mal durch.

probier das mal so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
   k:= Zahlenliste.Items.Count-1;
   SetLength (zahl,Zahlenliste.Items.Count);  //hier steht die anzahl der Elemente , also ohne -1
   for i:=0 to k do
      begin
        zahl[i]:= StrToInt (Zahlenliste.Items[i]);
      end;
   ...

und fang bei den anderen immer bei 0 an zu zählen, wie es Luckie gesagt hat

Mfg Frank

Moderiert von user profile iconPeter Lustig: Code- durch Delphi-Tags ersetzt


`shay´ - Sa 21.02.04 13:16

Dankeschön es funktioniert soweit...

Mal schauen wie ich mit den anderen Sortieralgorithmen klar komme...
In der Schule bekommen wir das nämlich eh nit mehr geregelt, aber hier finde ich sicher was über Sortierverfahren.


Delete - Sa 21.02.04 19:13

Kuckst du hier: http://www.delphipraxis.com/topic344_tutorial+sortieralgorithmen+iii.html