AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Fehlerteufel bei Delphi Treff

Ein Thema von ATS3788 · begonnen am 31. Dez 2014 · letzter Beitrag vom 31. Dez 2014
Antwort Antwort
Benutzerbild von ATS3788
ATS3788

Registriert seit: 18. Mär 2004
Ort: Kriftel
646 Beiträge
 
Delphi XE Starter
 
#1

Fehlerteufel bei Delphi Treff

  Alt 31. Dez 2014, 09:00
Hallo
bei den Kollegen vom Delphi Treff haben sich Fehler eingeschlichen.
Result ist IMMER -1, hat einer die Idee wie es richtig lauten muss.
matchPosition := 1; ist immer 1 da stimmt auch was nicht ?!

Guten Rutsch Freunde des Pascal


http://www.delphi-treff.de/tipps-tri...g-durchsuchen/

Datei nach einem bestimmten String durchsuchen
Um in einer Datei nach einem bestimmten String zu suchen, kann die folgende Funktion benutzt werden:
buffer: array[1..1024 * 1024] of Char; ist viel so viel Speicher
Da gibt ja sogar mein Rechner mit 8 GB ein Stackoverflow

Delphi-Quellcode:
function FindInFile(const AFileName: string; ASearchWord: string; AMatchCase: Boolean): Integer;
var
  fileStream: TFileStream;
  buffer: array[1..1024 * 1024] of Char;
  bufferSize: Integer;
  c: Char;
  matchPosition, i, lengthOfSearchWord: Integer;
  currentPosition, fileStreamSize: Integer;
begin
  Result := -1;
  lengthOfSearchWord := Length(ASearchWord);
  if lengthOfSearchWord = 0 then
    Exit;
  if not AMatchCase then
    ASearchWord := AnsiUpperCase(ASearchWord);
  matchPosition := 1;
  fileStream := TFileStream.Create(AFileName, fmOpenRead or fmShareDenyWrite);
  try
    fileStreamSize := fileStream.Size;
    currentPosition := 0;
    while currentPosition < fileStreamSize do
    begin
      bufferSize := Min(high(buffer), (fileStreamSize - currentPosition));
      fileStream.ReadBuffer(buffer, bufferSize);
      currentPosition := fileStream.Position;
      i := 1;
      
      while i 1 then /// while i = 1 then
        begin
          i := i - matchPosition + 1;
          matchPosition := 1;
        end;
        Inc(i);
      end;
    end;
  finally
    fileStream.Free;
  end;
end;
Martin MIchael
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#2

AW: Fehlerteufel bei Delphi Treff

  Alt 31. Dez 2014, 10:14
Da fehlt aber das "Herzstück" pos(ASearchword) .
Such doch hier mal nach boyer moore, wir hatten hier vor einiger Zeit eine angeregte Diskussion nach dem besten Suchalgo.

Gruß
K-h
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Fehlerteufel bei Delphi Treff

  Alt 31. Dez 2014, 10:17
Da ist wohl was beim Portieren auf die neue Forumssoftware schief gegangen. Ist ja auch ein end zu viel und while i ? 1 then ist syntaktisch falsch. Wie wär‘s dort mal nachzufragen?
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Fehlerteufel bei Delphi Treff

  Alt 31. Dez 2014, 10:31
Dieser Codeschnipsel ist sowieso völliger Krampf, denn ein Char ist je nach Delphi-Version 1 oder 2 Byte groß. Der Buffer ist somit entweder 1MB oder 2MB groß (1024*1024=1MB).

Und die zu dursuchende Datei ist das jetzt eine Text-Datei? Dann ist auch das Encoding der Datei wichtig, sonst findet man einfach nichts.

Und wenn die Datei einfach nur ein Haufen von Bytes ist wo aber einige Teile auch "Text" enthalten, dann kommt es auch dort auf die Kodierung an.

In einem Filestream kann ich nur zuverlässig nach einer Bytefolge suchen. Folglich muss der gesuchte Text in eine Bytefolge umgewandelt werden (evtl. sogar in mehrere, wenn ich den Text auch in den unterschiedlichsten Kodierungen finden möchte) und diese Bytefolge sucht man dann in dem Stream bzw. Buffer.

Der Buffer wird dann natürlich ein array of Byte
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von ATS3788
ATS3788

Registriert seit: 18. Mär 2004
Ort: Kriftel
646 Beiträge
 
Delphi XE Starter
 
#5

AW: Fehlerteufel bei Delphi Treff

  Alt 31. Dez 2014, 11:31
Wieder mal der Sir Rufo

Eine Aussage die von Qualität spricht.

Zitat:
Und ich dachte das ich mal wieder was verpeilt habe
Guten Rutsch
Martin MIchael
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.442 Beiträge
 
Delphi 12 Athens
 
#6

AW: Fehlerteufel bei Delphi Treff

  Alt 31. Dez 2014, 11:34
      while i 1 then /// while i = 1 then
Hat das überhaupt mal jemand dem Compiler zur Kontrolle gezeigt?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#7

AW: Fehlerteufel bei Delphi Treff

  Alt 31. Dez 2014, 11:56
So einen Schwachsinn??

Gruß
K-H

PS
@Sir Rufo
Wenn der Schnipsel hinreichend alt ist, dann ist char genommen worden, weil viele Programmierer das Byte gemieden haben wie der Teufel das Weihwasser. (oder da ist C-Code übersetzt worden)
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Fehlerteufel bei Delphi Treff

  Alt 31. Dez 2014, 12:02
Wäre es nicht sinnvoll diese Diskussion primär dort zu führen? Bzw. den DT auf den fehlerhaften Code hinzuweisen.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: Fehlerteufel bei Delphi Treff

  Alt 31. Dez 2014, 12:15
@Sir Rufo
Wenn der Schnipsel hinreichend alt ist, dann ist char genommen worden, weil viele Programmierer das Byte gemieden haben wie der Teufel das Weihwasser. (oder da ist C-Code übersetzt worden)
Das ist mir schon klar, macht es aber nicht besser
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Antwort Antwort


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 03:03 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