Autor |
Beitrag |
ZeitGeist87
      
Beiträge: 1593
Erhaltene Danke: 20
Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
|
Verfasst: Mi 16.06.10 21:15
Entweder bin ich blind, blöd oder es liegt daran, dass ich seit heute Kontaktlinsen tragen: Ich finde gerade keinen Fehler.
Würde es dir was ausmachen, das Projekt anzuhängen und eine Datei?
Falls du es nicht öffentlich machen willst, gern auch per PN.
LG
Stefan
--- Moderiert von Narses: Beiträge zusammengefasst---
Ganz einfach
Geh runter zur Ausgabe und such diese Zeilen
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| for i:= low(meineTreffer) to high(meineTreffer) do begin Memo2.lines.clear; Memo2.lines.add('Zeile ' + inttostr(i+1) + ': ' + IntToStr(meineTreffer[i]) + ' Treffer');
end; |
Du bist in einer Schleife und leerst bei jedem Durchlauf das Memo2
Setz das .clear einfach vor die Schleife.
LG
Stefan
_________________ Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
Für diesen Beitrag haben gedankt: noo.bee
|
|
noo.bee 
      
Beiträge: 120
|
Verfasst: Mi 16.06.10 22:19
tja dann würde ich sagen, dass du das prob gelöst hast  DANKEEEEE
|
|
ZeitGeist87
      
Beiträge: 1593
Erhaltene Danke: 20
Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
|
Verfasst: Mi 16.06.10 22:20
Da macht sich Erleichterung in mir breit und ich kann nun ruhigen Gewissens mich meinem Lesestoff widmen
Viel Spaß damit und gute Nacht.
_________________ Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
Für diesen Beitrag haben gedankt: noo.bee
|
|
noo.bee 
      
Beiträge: 120
|
Verfasst: Do 17.06.10 20:27
so, programm ausgiebig getestet  ABER ich habe folgendes festgestellt: der suchlauf berücksichtigt nicht, ob nach ein- oder zweistelligen zahlen gesucht werden sollen.
wenn ich also die zahlenkombi "1, 23, 4, 6, 11, 15, 19" nach der "1" durchsuche, müßte das ergebnis eigentlich 1 sein, da die "1" ja nur einmal drin ist. ich bekomm aber das ergebnis "5" wegen der "11" und der "15" und der "19".
|
|
ZeitGeist87
      
Beiträge: 1593
Erhaltene Danke: 20
Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
|
Verfasst: Do 17.06.10 20:51
Da hast du recht
Du könntest eine StringList einbauen, den Delimiter auf Leerzeichen stellen und die Zeile so aufsplitten lassen.
Dann musst du die StringList durchgehen und hättest das Problem gelöst.
Anderer Ansatz: Du prüfst, ob vor oder nach der Position ein Leerzeichen ist. Wenn ja, erhöhen ansonsten ignorieren.
Pass aber auf, wenn du ganz am Anfang bei jeder Zeile bist.
String geht bei 1 los. 1-1 (davor) = 0 = Zugriffsverletzung.
LG
Stefan
_________________ Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
|
|
noo.bee 
      
Beiträge: 120
|
Verfasst: Do 17.06.10 20:58
was, wie ? nochmal für mich zum mitschreiben... also ich versteh beide möglichkeiten nicht  hast noch eine, die ich auch hinbekomm 
|
|
ZeitGeist87
      
Beiträge: 1593
Erhaltene Danke: 20
Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
|
Verfasst: Do 17.06.10 21:15
Entschuldige.
Ich würde dir die zweite Möglichkeit ans Herz legen.
Im Moment haben wir es so *Ich such mal den Quelltext*
Ah.
Wir suchen einfach mit pos() das Vorkommen der Zahl, unabhängig davon, ob ein- oder zweistellig.
Ich würde vorschlagen, wir basteln jetzt einfach eine Funktion, die uns die Arbeit abnimmt. Vorteil: Einmal etwas Aufwand und dann nur eine Zeile
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:
| function checkVorkommen(Zeile, Zahl: String): Boolean; var _pos: Integer; _len: Integer; begin; try result:= false; _pos:= pos(Zahl, Zeile); _len:= length(Zeile);
case _pos of 1: begin if (_pos+length(Zahl)) <= _len then begin if not (Zeile[_pos+length(Zahl)] = #32) then exit; end; end; else begin if _pos-1 < 1 then exit; if _pos = _len then begin if Zeile[_pos-1] <> #32 then exit; end;
if _pos+length(Zahl) <= _len then begin if (Zeile[_pos-1] <> #32) or (Zeile[_pos+length(Zahl)] <> #32) then exit; end else begin if Zeile[_pos-1] <> #32 then exit; end; end; end;
result:= true; except on e: exception do messagebox(application.handle, pchar(e.message), pchar('Fehler'), MB_IconERROR); end; end; |
Im bisherigen Quelltext entfallen die Zeilen if pos(def_a, zeile) > 0 then und werden durch Delphi-Quelltext 1: 2:
| if checkVorkommen(Zeile, def_a) then inc(Treffer); | ersetzt.
Ich hoffe, ich hab es ohne Logikfehler getippt.
LG
Stefan
Edit: Zur Sicherheit bau ich mir schnell ein Testprogramm
Edit die Zweite: Bekannter Bug: Da immer nur das erste Vorkommende Zeichen relevant ist, werden spätere, einstellige in der gleichen Zeile nicht gefunden.
Bsp.: 45 36 8 3 6 und nach 6 wird gesucht: Findest Position 4, ist aber fehlerhaft, da davor kein Leerzeichen. 6 an letzter Position wird nicht mehr gefunden.
Wie kompensieren: An entsprechender Stelle einen weiteren pos()-Aufruf in einem REPEAT...UNTIL suchpos = _len;
_________________ Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
|
|
noo.bee 
      
Beiträge: 120
|
Verfasst: Fr 18.06.10 18:14
bekannter bug ? also bei mir läufts ohne prob. oder hab ich den fehler nicht gefunden ?
ich hab nirgends "An entsprechender Stelle einen weiteren pos()-Aufruf in einem REPEAT...UNTIL suchpos = _len;" eingefügt
EDIT: doch n fehler gefunden. schau mal auf den screenshot. warum hab ich in zeile 1 keinen treffer ? dort wäre doch die "1" vorhanden :/
Einloggen, um Attachments anzusehen!
|
|
ZeitGeist87
      
Beiträge: 1593
Erhaltene Danke: 20
Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
|
Verfasst: Fr 18.06.10 18:24
Ist mir gestern aufgefallen, als ich das Testprogramm schnell geschrieben hab.
Wie gesagt, nimm meine Zahlenreihe: {code]45 36 8 3 6[/code]
Füg in def_a (edit1.text) 6 ein und die restlichen Felder 0 oder leer lassen.
Klick auf auswerten.
Wir rutschen dann in die Routine des Auswertens herein und dort passiert folgendes.
Über pos('6', '45 36 8 3 6') wird die Position 5 ausgegeben, da die 6 das erste Mal bei 36 auftaucht.
Nun ist diese Position mitten in der Zeichenkette und es wird geprüft, ob davor und danach ein Leerzeichen ist. Ist jedoch nicht der Fall, also kein Treffer.
Und genau da müsste die zeichenweite Suche ansetzen, dass du den String von der gefundenen Stelle bis zum Schluss durchläufst, um wirklich sicher zu sein
Das ist der Bug.
Zu deinem Edit: Ich tipp es mal bei mir ein und analysier 
_________________ Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
|
|
ZeitGeist87
      
Beiträge: 1593
Erhaltene Danke: 20
Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
|
Verfasst: Fr 18.06.10 18:31
Konnte keinen Fehler feststellen.
Screenshot anbei
Einloggen, um Attachments anzusehen!
_________________ Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
|
|
|