Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Suchalgorithmus -> Ungültige Zeigeroperation (https://www.delphipraxis.net/9228-suchalgorithmus-ungueltige-zeigeroperation.html)

WhiteStar99 21. Sep 2003 10:29


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:
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;
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).

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.

Habe das Programm mal hier hochgeladen

Wäre für jede Hilfe dankbar!

Gruß

Luckie 21. Sep 2003 10:35

Re: Suchalgorithmus -> Ungültige Zeigeroperation
 
Du läufst hier
Delphi-Quellcode:
for i:=0 to (laenge) do
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...

WhiteStar99 21. Sep 2003 10:54

Re: Suchalgorithmus -> Ungültige Zeigeroperation
 
wow, danke für die schnelle Antwort! :)
also es liegt tatsächlich an der laenge.

Delphi-Quellcode:
for i:=0 to (laenge-1) do
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
Ich wusste schon immer, dass ich arrays nicht mag ;) Irgendwo hab ich noch nen Denkfehler ;)

Vielen Dank schonmal für deine Hilfe! :)

anku 21. Sep 2003 11:35

Re: Suchalgorithmus -> Ungültige Zeigeroperation
 
Delphi-Quellcode:
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;
mfg

WhiteStar99 21. Sep 2003 11:39

Re: Suchalgorithmus -> Ungültige Zeigeroperation
 
vielen dank euch beiden! ich habs :)
habt mir sehr geholfen!

anku 21. Sep 2003 11:47

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:
for i:=Low( Feld) to High( Feld)
Low liefert den niedrigsten und High den Höchsten Index eines Arrays zurück.

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

WhiteStar99 21. Sep 2003 12:06

Re: Suchalgorithmus -> Ungültige Zeigeroperation
 
Zitat:

Zitat von anku
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:
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;
MfG

wenn ich deinen Vorschlag mit lb1.items.count benutze, bekomme ich wieder eine Fehlermeldung, der Index der Liste überschreitet das Maximum.
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 ;)

anku 21. Sep 2003 12:17

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.

WhiteStar99 21. Sep 2003 12:25

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 21:04 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