AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Suchalgorithmus -> Ungültige Zeigeroperation

Suchalgorithmus -> Ungültige Zeigeroperation

Ein Thema von WhiteStar99 · begonnen am 21. Sep 2003 · letzter Beitrag vom 21. Sep 2003
Antwort Antwort
WhiteStar99

Registriert seit: 21. Sep 2003
Ort: Hanau
6 Beiträge
 
Delphi 5 Professional
 
#1

Suchalgorithmus -> Ungültige Zeigeroperation

  Alt 21. Sep 2003, 11:29
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ß
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Suchalgorithmus -> Ungültige Zeigeroperation

  Alt 21. Sep 2003, 11:35
Du läufst hier
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...
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
WhiteStar99

Registriert seit: 21. Sep 2003
Ort: Hanau
6 Beiträge
 
Delphi 5 Professional
 
#3

Re: Suchalgorithmus -> Ungültige Zeigeroperation

  Alt 21. Sep 2003, 11:54
wow, danke für die schnelle Antwort!
also es liegt tatsächlich an der laenge.

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!
  Mit Zitat antworten Zitat
anku

Registriert seit: 13. Sep 2003
51 Beiträge
 
#4

Re: Suchalgorithmus -> Ungültige Zeigeroperation

  Alt 21. Sep 2003, 12:35
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
  Mit Zitat antworten Zitat
WhiteStar99

Registriert seit: 21. Sep 2003
Ort: Hanau
6 Beiträge
 
Delphi 5 Professional
 
#5

Re: Suchalgorithmus -> Ungültige Zeigeroperation

  Alt 21. Sep 2003, 12:39
vielen dank euch beiden! ich habs
habt mir sehr geholfen!
  Mit Zitat antworten Zitat
anku

Registriert seit: 13. Sep 2003
51 Beiträge
 
#6

Re: Suchalgorithmus -> Ungültige Zeigeroperation

  Alt 21. Sep 2003, 12:47
Wenn du dir nicht sicher bist, welche Indizes du benutzen musst, dann ist es am einfachsten wenn du so was in der Art benutzt:
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
  Mit Zitat antworten Zitat
WhiteStar99

Registriert seit: 21. Sep 2003
Ort: Hanau
6 Beiträge
 
Delphi 5 Professional
 
#7

Re: Suchalgorithmus -> Ungültige Zeigeroperation

  Alt 21. Sep 2003, 13:06
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
  Mit Zitat antworten Zitat
anku

Registriert seit: 13. Sep 2003
51 Beiträge
 
#8

Re: Suchalgorithmus -> Ungültige Zeigeroperation

  Alt 21. Sep 2003, 13:17
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.
Angehängte Dateien
Dateityp: pas unit1_296.pas (1,9 KB, 5x aufgerufen)
  Mit Zitat antworten Zitat
WhiteStar99

Registriert seit: 21. Sep 2003
Ort: Hanau
6 Beiträge
 
Delphi 5 Professional
 
#9

Re: Suchalgorithmus -> Ungültige Zeigeroperation

  Alt 21. Sep 2003, 13:25
danke, ich glaube, das ist jetzt so noch ne Ecke besser, bin ja noch Anfängerin
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 17:27 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