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 public 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
Peter 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
Peter 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); 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
Peter 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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!