![]() |
Suchalgorithmus -> Ungültige Zeigeroperation
Hallo!
ich weiß echt nimmer weiter mit meinem Programm, hier mal der Quellcode:
Delphi-Quellcode:
function TForm1.BinSuche(Key,laenge : Integer):integer;
var A, E : integer; M : integer; i : integer; feld : array of integer; begin // array füllen setlength(feld, laenge); for i:=0 to (laenge) do feld[i]:=strtoint(lb1.items.strings[i]); // such algorithmus A := 1; E := length(feld)+1; while A < E do begin M := (A + E) div 2; if Key > feld[M] then A := M+1 else E := M; end; if (feld[E] = Key) then result := E else result := 0; end;
Delphi-Quellcode:
das Programm hat 4 Eingabefehler, 3 davon muss man ausfüllen, Einmal Anfang für einen Startwert (zB 10), ein Ende zB 50 und ein Key (zu suchende Zahl).
procedure TForm1.BSuchenClick(Sender: TObject);
var Ergebnis, laenge : integer; begin laenge:= strtoint(EEnde.text)-strtoint(EAnfang.text); //function aufrufen, result in Ergebnis speichern Ergebnis:=BinSuche(StrToInt(EKey.Text),laenge); EErgebnis.text:=inttostr(Ergebnis); end; procedure TForm1.BGenerierenClick(Sender: TObject); var i, anfang,laenge : integer; feld: array of integer; begin anfang:=strtoint(EAnfang.text); laenge:= strtoint(EEnde.text)-strtoint(EAnfang.text); setlength(feld, laenge); // stringlist füllen for i:=0 to (laenge) do begin feld[i]:=anfang; inc(anfang); lb1.items.strings[i]:=inttostr(feld[i]); end; end; Bsp: Anfang 10, Ende 50 --> StringList 10,11,12,13,..,50 Key: 12 Ergebnis müsste 2 sein (da Index mit 0 beginnend). Das Problem ist, dass das Programm ständig mit "Ungültige Zeigeroperation" aussteigt. Wenn ich als Bsp 20 und 50 nehme, dann klappt das Programm ohne den Fehler, bringt aber nach Schließung einen Zugriffsverletzungs-Fehler. Ich weiß echt nicht mehr weiter, voralllem ist diese Ungültige Zeigeroperation Fehlermeldung für mich so nichtssagend. Sie kommt sogar, wenn ich im Quellcode in der function die variable result manuell auf 12 stelle. ![]() Wäre für jede Hilfe dankbar! Gruß |
Re: Suchalgorithmus -> Ungültige Zeigeroperation
Du läufst hier
Delphi-Quellcode:
von 0 bs laenge. laenge ist die Größe des Arrays, zum Beispiel 10. Jetzt durchlkäufst du 11 Elemente 1 bis 10 plus das nullte...
for i:=0 to (laenge) do
|
Re: Suchalgorithmus -> Ungültige Zeigeroperation
wow, danke für die schnelle Antwort! :)
also es liegt tatsächlich an der laenge.
Delphi-Quellcode:
gibt er keine Fehlermeldung mehr aus. Problem bleibt jetzt, dass er das letzte Element des Arrays nicht mehr sieht. Wenn ich beim generieren laenge benutze, erstellt er mir die stringlist richtig, beim array füllen geht aber laenge-1 in dem Sinne nicht, da er dann zB die 50 (als Ende) beim Ermitteln der Suche nicht mehr berücksichtigt. Verwende ich beim Stringlistfüllen laenge-1, fehlt die 49
for i:=0 to (laenge-1) do
Ich wusste schon immer, dass ich arrays nicht mag ;) Irgendwo hab ich noch nen Denkfehler ;) Vielen Dank schonmal für deine Hilfe! :) |
Re: Suchalgorithmus -> Ungültige Zeigeroperation
Delphi-Quellcode:
mfg
procedure TForm1.BGenerierenClick(Sender: TObject);
var i, anfang,laenge : integer; feld: array of integer; begin anfang:=strtoint(EAnfang.text); laenge:= strtoint(EEnde.text)-strtoint(EAnfang.text); setlength(feld, laenge+1); // <-- hier war der Fehler, du brauchst ein element mehr // stringlist füllen for i:=0 to (laenge) do begin feld[i]:=anfang; inc(anfang); lb1.items.strings[i]:=inttostr(feld[i]); end; end; |
Re: Suchalgorithmus -> Ungültige Zeigeroperation
vielen dank euch beiden! ich habs :)
habt mir sehr geholfen! |
Re: Suchalgorithmus -> Ungültige Zeigeroperation
Wenn du dir nicht sicher bist, welche Indizes du benutzen musst, dann ist es am einfachsten wenn du so was in der Art benutzt:
Delphi-Quellcode:
Low liefert den niedrigsten und High den Höchsten Index eines Arrays zurück.
for i:=Low( Feld) to High( Feld)
Dein Source hat aber noch eine kleine Lücke, da man den Wert der Edits ja zwischen dem generieren und dem Suchen ändern kann. Also solltest du für den Suchdurchlauf die Anzahl der Einträge in deiner Liste abfragen:
Delphi-Quellcode:
MfG
procedure TForm1.BSuchenClick(Sender: TObject);
var Ergebnis, laenge : integer; begin laenge:= lb1.Items.Count; //strtoint(EEnde.text)-strtoint(EAnfang.text); //function aufrufen, result in Ergebnis speichern Ergebnis:=BinSuche(StrToInt(EKey.Text),laenge); EErgebnis.text:=inttostr(Ergebnis); end; |
Re: Suchalgorithmus -> Ungültige Zeigeroperation
Zitat:
Habe wie oben geschrieben setlength(feld, laenge+1); jeweils in Bgenerieren und BSuchen verwendet, ansosnten alles beim alten, damit klappt es. Und ich bin mir auch sicher, dass der Quellcode ziemlich schlecht ist ;) |
Re: Suchalgorithmus -> Ungültige Zeigeroperation
Liste der Anhänge anzeigen (Anzahl: 1)
Der lb1.Items.Count liefert dir schon die Anzahl der Elemente(41) zurück, um bei deinen Beispielwerten zu bleiben. Bei der Berechnung 50-10 kommt ja 40 raus, desshalb musst du da dann eins dazu addieren.
Ich hab mal die Unit1 angehangen. |
Re: Suchalgorithmus -> Ungültige Zeigeroperation
danke, ich glaube, das ist jetzt so noch ne Ecke besser, bin ja noch Anfängerin ;)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:23 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