AW: Anzahl eines Zeichens im String ermitteln
Man kann ja auch die RandomString() seperat aufrufen um damit eine feste Datei erzeugen.
Ich wollte den Traffic sparen und fand hier in DP diese nützliche Unit um Strings beliebiger Länge zu generieren in dem moment praktikabler aber der Replikation und Schwankungen zur Folge hast Du Recht, so ist es nur eine objektive Momentaufnahme. Bei Tokyo ist ja TStopWatch enthalten, die Timing-Funktion kann man damit auch ersetzen/erweitern, ob damit andere/bessere Ergebnisse rauskommen? |
AW: Anzahl eines Zeichens im String ermitteln
Zitat:
|
AW: Anzahl eines Zeichens im String ermitteln
Zitat:
String[i] ist immer langsam. Die Schleife ist da nicht unbedingt schuld, sondern die permanente Indexierung der Speicheraddresse und die damit verbundenen RangeChecks. Durch deinen CodeStyle ak. Pointer-Math gibt es eben diese Checks erst gar nicht nicht.
Delphi-Quellcode:
@Himitsu,
function CharCount(const S: string; C: Char): Cardinal;
var P, PEnd: PChar; begin Result := 0; P := Pointer(S); if P = nil then Exit; {$IFNDEF FPC} PEnd := P + PLongInt(NativeUInt(P) - SizeOf(LongInt))^; {$ELSE} PEnd := P + PSizeInt(NativeUInt(P) - SizeOf(SizeInt))^; {$ENDIF} while P < PEnd do begin if P^ = C then Inc(Result); Inc(P); end; end; was soll da nicht stimmen? Das TStrRec ist sowol unter Delphi64/32 bit gleich definiert. Also wo ist der Haken, wenn du es schon ansprichst? |
AW: Anzahl eines Zeichens im String ermitteln
Zitat:
Dann ändert Emba die Struktur und es knallt. :stupid: Wenn möglich also immer vordefinierte Casts/Funktion nutzen und nicht gefährlich selber auf interne Strukturen zugreifen. Ich sehe hier auch keinen Vorteil, weswegen nicht Length verwendet werden kann. Die Funktion hat dann sogar 70% weniger Code. Und auch für die anderen Informationen gibt es schon seit 9 Jahren fertige Funktionen.
Delphi-Quellcode:
Gut, bissl blöd ist, dass
{ string info utilities }
function StringElementSize(const S: UnicodeString): Word; overload; inline; function StringElementSize(const S: RawByteString): Word; overload; inline; function StringCodePage(const S: UnicodeString): Word; overload; inline; function StringCodePage(const S: RawByteString): Word; overload; inline; function StringRefCount(const S: UnicodeString): Integer; overload; inline; function StringRefCount(const S: RawByteString): Integer; overload; inline; {$IFNDEF MSWINDOWS} function StringElementSize(const S: WideString): Word; overload; inline; function StringCodePage(const S: WideString): Word; overload; inline; function StringRefCount(const S: WideString): Integer; overload; inline; {$ENDIF}
Delphi-Quellcode:
in der System-Unit nicht öffentlich deklariert sind, sonst könnte man sie direkt zum Casten nehmen.
type
PStrRec = ^StrRec; StrRec = packed record codePage: Word; elemSize: Word; refCnt: Longint; length: Longint; end; PDynArrayRec = ^TDynArrayRec; TDynArrayRec = packed record RefCnt: LongInt; Length: LongInt; end; |
AW: Anzahl eines Zeichens im String ermitteln
Assoooo! Und ich dachte schon ...
Der code ist mir klar. Auch die möglicherweise begleitenden Probleme die sich durch den Anruf bei Emba ergeben könnten. Wenn man so mit dem Speicher spielt, sollte das auch klar sein. Da greift man auch anders an:
Delphi-Quellcode:
Das gewöhnt man sich an, wenn gleicher code von D2...XE10.2 laufen soll, jedoch inline code erst seit D2005 möglich ist und jeder call 50cycles verschwended, wie mir Uwe so schön gezeigt hat.
type
//zentral deklariert PStrLenInt ^StrLenInt; StrLenInt = {$IFDEF FPC}SizeInt{$ELSE}LongInt{$ENDIF}; // sollte Delphi den speicher bereich über 2/4GB wie FPC-64 jemals erweitern, würde da ein weiteres Property-Based define den richtigen Type declarieren. // somit schaut der code so aus: function CharCount(const S: string; C: Char): Cardinal; var P, PEnd: PChar; begin Result := 0; P := Pointer(S); if P = nil then Exit; PEnd := P + PStrLenInt(NativeUInt(P) - SizeOf(StrLenInt))^; while P < PEnd do begin if P^ = C then Inc(Result); Inc(P); end; end; Bedenken hin oder her, wo jedoch ist das CPU64 Problem? Oder gibt es doch keins? Edit PS.: 4GB sind yuch nur für den UnicodeString verfügbar, da ElementSize = 2 ist, theoretische 8GB für einen UCS4String (wenn es den gibt unter Delphi?) und nur 2GB für all SingleByte-Long-Strings. Edit2: Selbst wenn StrRec/PStrRec definiert wären wie soll denn dann der Cast ausschauen? Du hast nur einen Speichblock mit n-Bytes. Eine cast über PStrRec müßte auch rückwärts (SizeOf(StrRec))gerechnet werden. |
AW: Anzahl eines Zeichens im String ermitteln
Zitat:
Aber das war nicht das Problem. Dann hätte ich mich wahrscheinlich nicht verzählt sondern direkt ne Zugriffsverletzung erhalten. |
AW: Anzahl eines Zeichens im String ermitteln
Zitat:
|
AW: Anzahl eines Zeichens im String ermitteln
Zitat:
Klappt es denn mit cld als erste Anweisung bei dir? |
AW: Anzahl eines Zeichens im String ermitteln
Zitat:
Delphi-Quellcode:
function TTextReaderHelper.ReadQuotedLine(QuoteChar: Char): string;
var line: string; begin Result := ReadLine; if Odd(Result.CountChar(QuoteChar)) then begin { Eine ungerade Anzahl von Quotes bedeutet, daß der gequotete String mindestens einen Zeilenumbruch enthält. Wir hängen also die nachfolgenden Zeilen mit LineBreak an, bis eine weitere Zeile mit ungerader Anzahl Quotes kommt. } repeat Result := Result + sLineBreak; line := ReadLine; Result := Result + line; until Odd(line.CountChar(QuoteChar)); end; end; |
AW: Anzahl eines Zeichens im String ermitteln
Zitat:
Übrigens: Bei den Funktionen, die auch #0 Zeichen im String zulassen und somit auch danach suchen lassen, muss man beachten, daß der String immer mit einem #0 Zeichen abgeschlossen wird (bei Length + 1), aber dieses nicht mitgezählt werden darf. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:31 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