![]() |
Re: Monatskürzel "Jan".."Dec" in 01..12
Delphi-Quellcode:
Gruß Hagen
function IndexOfMonth(const Name: String): Integer;
begin Result := Pos('.' + AnsiUpperCase(Name) + '.', '.JAN.FEB.MAR.APR.MAY.JUN.JUL.AUG.SEP.OCT.NOV.DEC.'); if Result > 0 then Result := (Result -1) div 4 +1; end; |
Re: Monatskürzel "Jan".."Dec" in 01..12
Hallo Leuselator hallo Steffen,
falls ihr Euch für eine Variante mit case entscheiden solltest, wäre es von Vorteil, wenn Ihr in Euren Schleifen von oben nach unten iteriert. Es wird so nicht nur etwas übersichtlicher
Delphi-Quellcode:
sondern bei großen Arrays ggf schneller, weil
function IndexOfArrayItem(const AnArray : array of string;
const AnItem : string):Integer; begin Result := High(TheArray); while (Result >= Low(AnArray)) and (AnArray[Result] <> AnItem) do Dec(Result); end;
Delphi-Quellcode:
lediglich Result gegen null testet, wohingegen ggf (sofern zB nicht mit const gearbeitet wird, wie von Leuselator gezeigt)
Result >= Low(AnArray)
Delphi-Quellcode:
jedesmal einen Speicherzugriff verursacht...
Result <= High(AnArray)
Wenn ich das ich richtig sehe, Steffen, besitzt Du D7E. Dort sollte es eine überladene Variante von StrToDate geben, die mit eigenen Format-Einstellungen arbeiten kann. Für eine solche Verwendung könntest Du Dir mit GetLocaleFormatSettings die entsprechenden US-Einstellungen in einer Variablen halten und Deine Umformung, durch eine Funktion gewrappt wie folgt gestalten:
Delphi-Quellcode:
function MyStringToDate(const AString: string): TDate;
begin Result:= StringToDate(AString, MyStoredSettings); end; |
Re: Monatskürzel "Jan".."Dec" in 01..12
BTW, in der Unit StrUtils gibt es bereits die beiden Funktionen AnsiMatchStr und AnsiMatchStr:
Zitat:
|
Re: Monatskürzel "Jan".."Dec" in 01..12
@choose, deine Annahme das das Runterzählen schneller ist ist einfach falsch.
1.) Da du Result als Zählervariable benutzt verhinderst du das der Compiler den Code besser optimieren kann 2.) WENN der Compiler optimieren kann dann würde er schnelleren Code mit einer simplen for to Schleife erzeugen. In diesem Beispiel würde er Assemblercode erzeugen der auch gegen Null überprüft 3.) Eine BottomUp Schleife ist Cache-unfreundlich besser ist folgender Code
Delphi-Quellcode:
Gruß Hagen
var
I: Integer; begin for I := Low() to High() do if Data[I] = XYZ then begin Result := I; Exit; end; end; |
Re: Monatskürzel "Jan".."Dec" in 01..12
Hallo Hagen,
im Vordergrund stand bei meiner Antwort die Übersichtlichkeit des Quellcodes Zitat:
Zitat:
Delphi-Quellcode:
übersichtlicher als
function MyProc: Integer;
begin Result:= 0; while SomeCriteria do Inc(Result); end;
Delphi-Quellcode:
function MyProc: Integer;
var myExtension: Integer; begin myExtension:= 0; while SomeCriteria do Inc(myExtension); Result:= myExtension; end; Zitat:
Tatsächlich ist die For-Schleife nicht nur bei der Abbruchbedingung genauso performant wie die TopDown lösung, sich arbeitet sogar direkt mit einem Index im array, so dass die Errechnung selbigens bei der While-Schleife entfält.
Code:
innerhalb der For-Schleife und dagegen die errechnung des Indexes innerhalb der Whileschleife:
[b]DoSthWithStr(AnArray[myIndex])[/b]
mov EAX, [EBX] call DoSthWithStr add EBX, $04
Code:
[b]DoSthWithStr(AnArray[myIndex])[/b]
mov EAX, [EBP-$04] mov EAX, [EAX+EBX*4] call DoSthWithStr inc EBX Zitat:
Für performancekritische Lösungen des ursprünglichen Problems von Steffen würde ich ebenfalls eine Lösung der von Dir vorgeschlagenen Art verwenden, jedoch mit einem besseren Match-Algorithmus als der in Pos implementierte, bspw einer modifizierte Version des Boyer-Moore-Algorithmus oder einer Form des Hashings... |
Re: Monatskürzel "Jan".."Dec" in 01..12
Zitat:
Zitat:
Ich verstehe deine Motive saubern Code zu produzieren sehr gut, bin ja selber ein Pedant :), ABER ich kann dir nicht zustimmen in dem Punkt das bedingte Schleifen wie while do/repeat until einfachere Schleifen sind als normale Zählschleifen. Gruß Hagen |
Re: Monatskürzel "Jan".."Dec" in 01..12
*räusper*
Ehm - ich bin schuld :oops:! Habe das Problem von Mücke zum Elefanten aufgeblasen, weil ich eine allgemeinere Funktion wie IndexOf bei TList für Arrays anbieten wollte. Der Code stimmt ziemlich genau mit dem der VCL zu TList.IndexOf überein. Nicht ganz klar ist mir in der losgetretenen Disskusion die Sache mit dem Prüfen gegen Null, da Low(AnArray) doch nicht zwangsläufig 0 sein muß? Ich finde es allemal interessant, wie viele verschiedene Wege nach Rom es doch gibt - dieser Thread kann als gutes Beispiel dienen, wenn man einem Nichtprogrammierer erklären möchte, warum Softwareentwicklung immer auch stark die individuellen Denkstrukturen der beteiligten Programmierer widerspiegelt. Also bitte nicht mehr streiten :-) Gruß |
Re: Monatskürzel "Jan".."Dec" in 01..12
Zitat:
Delphi-Quellcode:
function IndexOfMonth(const AName: String): Integer;
const Hash_Jan = (Ord('J') shl 16) or (Ord('A') shl 8) or Ord('N'); Hash_Feb = (Ord('F') shl 16) or (Ord('E') shl 8) or Ord('B'); Hash_Mar = (Ord('M') shl 16) or (Ord('A') shl 8) or Ord('R'); Hash_Apr = (Ord('A') shl 16) or (Ord('P') shl 8) or Ord('R'); Hash_May = (Ord('M') shl 16) or (Ord('A') shl 8) or Ord('Y'); Hash_Jun = (Ord('J') shl 16) or (Ord('U') shl 8) or Ord('N'); Hash_Jul = (Ord('J') shl 16) or (Ord('U') shl 8) or Ord('L'); Hash_Aug = (Ord('A') shl 16) or (Ord('U') shl 8) or Ord('G'); Hash_Sep = (Ord('S') shl 16) or (Ord('E') shl 8) or Ord('P'); Hash_Oct = (Ord('O') shl 16) or (Ord('C') shl 8) or Ord('T'); Hash_Nov = (Ord('N') shl 16) or (Ord('O') shl 8) or Ord('V'); Hash_Dec = (Ord('D') shl 16) or (Ord('E') shl 8) or Ord('C'); begin if Length(AName)<>3 then Result:= 0 else case (Ord(UpCase(AName[1])) shl 16) or (Ord(UpCase(AName[2])) shl 8 ) or Ord(UpCase(AName[3])) of Hash_Jan: Result:= 1; Hash_Feb: Result:= 2; Hash_Mar: Result:= 3; Hash_Apr: Result:= 4; Hash_May: Result:= 5; Hash_Jun: Result:= 6; Hash_Jul: Result:= 7; Hash_Aug: Result:= 8; Hash_Sep: Result:= 9; Hash_Oct: Result:= 10; Hash_Nov: Result:= 11; Hash_Dec: Result:= 12; else Result:= 0; end; end; Zitat:
Formal:
Code:
und damit ist die Anzahl der Iterationen nicht bekannt.
x=p v x<=p <=> x<=p != x=p
Zitat:
|
Re: Monatskürzel "Jan".."Dec" in 01..12
Hallo Leuselator,
Zitat:
Zitat:
Zitat:
|
Re: Monatskürzel "Jan".."Dec" in 01..12
Danke für die Zahlreichen Antworten...!
Nun weiß ich aber nicht, welcher Lösungsansatz nun wirklich der einfachste, beste und schnellste weg zur Lösung ist. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz