Autor Beitrag
ZeitGeist87
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1593
Erhaltene Danke: 20

Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
BeitragVerfasst: 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 user profile iconNarses: Beiträge zusammengefasst---

Ganz einfach :)

Geh runter zur Ausgabe und such diese Zeilen

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
//Glückwunsch!
 //An dieser Position wurden alle deine Zeilen abgearbeitet und auf Treffer überprüft.

 //Zur Ausgabe:
 //Einfach über deine Trefferliste meineTreffer eine Schleifen laufen lassen und den Wert ausgeben, der dahintersteht.
 for i:= low(meineTreffer) to high(meineTreffer) do
 begin
  //Memo leeren
  Memo2.lines.clear;
  //Ausgabe
  Memo2.lines.add('Zeile ' + inttostr(i+1) + ': ' + IntToStr(meineTreffer[i]) + ' Treffer');

  //Warum i+1 bei der Zeile?
  //Nun, du beginnst die Zeilen bei 1 zu zählen, Delphi bei 0 ;-)
 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 120



BeitragVerfasst: Mi 16.06.10 22:19 
tja dann würde ich sagen, dass du das prob gelöst hast ;) DANKEEEEE
ZeitGeist87
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1593
Erhaltene Danke: 20

Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 120



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1593
Erhaltene Danke: 20

Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 120



BeitragVerfasst: 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 :wink:
ZeitGeist87
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1593
Erhaltene Danke: 20

Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
BeitragVerfasst: 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 :)

ausblenden volle Höhe 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:
function checkVorkommen(Zeile, Zahl: String): Boolean;
var _pos: Integer; //Hier speichern wir die Position unseres Fundes
    _len: Integer; //Länge der Zeile (in Zeichen)
begin;
 try
  //Rückgabe undefiniert (false)
  result:= false;
  
  _pos:= pos(Zahl, Zeile);
  _len:= length(Zeile);

 case _pos of
  1:     begin
          //Zeichen an erster Stelle, nachfolgendes Zeichen muss Leerzeichen sein, verschoben und lenght(Zahl);
          //Natürlich darf Zeile[_pos+length(Zahl)] die length(Zeile) nicht übersteigen
          if (_pos+length(Zahl)) <= _len then
          begin 
           //Hier auf Leerzeichen prüfen
           if not (Zeile[_pos+length(Zahl)] = #32then
            exit; //Wegwerfen, da ungültig
          end;
         end;
  else
  begin
   //Und hier der Spezialfall: Mitten in der Zeichenkette

   if _pos-1 < 1 then
    exit; //String[0] geht nicht

   if _pos = _len then
   begin
    //hier müssen wir nur einen Schritt nach "links" gehen und schon muss da ein Leerzeichen sein
    if Zeile[_pos-1] <> #32 then
     exit; //Doch keins -> Abbruch
   end;

   if _pos+length(Zahl) <= _len then
   begin
    //Hier schießen wir über kein Ziel hinaus
    if (Zeile[_pos-1] <> #32or
       (Zeile[_pos+length(Zahl)] <> #32then
     exit; //Mittendrin, aber links und rechts kein Leerzeichen
   end
   else
   begin
    //Hier nur davor
    if Zeile[_pos-1] <> #32 then
     exit;
   end;
  end;
 end;
  

  //Verarbeitung erfolgreich
  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
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 120



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1593
Erhaltene Danke: 20

Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1593
Erhaltene Danke: 20

Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
BeitragVerfasst: 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.