Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Fehlerteufel bei Delphi Treff (https://www.delphipraxis.net/183314-fehlerteufel-bei-delphi-treff.html)

ATS3788 31. Dez 2014 08:00

Fehlerteufel bei Delphi Treff
 
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:
Delphi-Quellcode:
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;

p80286 31. Dez 2014 09:14

AW: Fehlerteufel bei Delphi Treff
 
Da fehlt aber das "Herzstück"
Delphi-Quellcode:
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

Bjoerk 31. Dez 2014 09:17

AW: Fehlerteufel bei Delphi Treff
 
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?

Sir Rufo 31. Dez 2014 09:31

AW: Fehlerteufel bei Delphi Treff
 
Dieser Codeschnipsel ist sowieso völliger Krampf, denn ein
Delphi-Quellcode:
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
Delphi-Quellcode:
array of Byte

ATS3788 31. Dez 2014 10:31

AW: Fehlerteufel bei Delphi Treff
 
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

Uwe Raabe 31. Dez 2014 10:34

AW: Fehlerteufel bei Delphi Treff
 
Zitat:

Zitat von ATS3788 (Beitrag 1285031)
Delphi-Quellcode:
      while i 1 then /// while i = 1 then

Hat das überhaupt mal jemand dem Compiler zur Kontrolle gezeigt?

p80286 31. Dez 2014 10:56

AW: Fehlerteufel bei Delphi Treff
 
So einen Schwachsinn??

Gruß
K-H

PS
@Sir Rufo
Wenn der Schnipsel hinreichend alt ist, dann ist
Delphi-Quellcode:
char
genommen worden, weil viele Programmierer das Byte gemieden haben wie der Teufel das Weihwasser. (oder da ist C-Code übersetzt worden)

mkinzler 31. Dez 2014 11:02

AW: Fehlerteufel bei Delphi Treff
 
Wäre es nicht sinnvoll diese Diskussion primär dort zu führen? Bzw. den DT auf den fehlerhaften Code hinzuweisen.

Sir Rufo 31. Dez 2014 11:15

AW: Fehlerteufel bei Delphi Treff
 
Zitat:

Zitat von p80286 (Beitrag 1285044)
@Sir Rufo
Wenn der Schnipsel hinreichend alt ist, dann ist
Delphi-Quellcode:
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 ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:56 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