Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Ord für Int64 (https://www.delphipraxis.net/139803-ord-fuer-int64.html)

Alter Mann 5. Sep 2009 19:22


Ord für Int64
 
Hallo

gibt es eine Funktion die ein 'Ord für Int64' ermöglicht bzw. eine alternative hierfür:

Delphi-Quellcode:
  function GetTC(IntStr : String) : Integer;
  var
    I : Integer;
    S : Char; //PWideChar;
  begin
    Result := 0;
    if GetLocaleInfo(GetUserDefaultLangID, LOCALE_STHOUSAND, S, SizeOf(PWideChar)) = 0 then S := '.';

    for I := 1 to Length(IntStr) do
      if Ord(IntStr[I]) = Ord(S) then Inc(Result); // <- geht nicht, da Int64!
  end;
Für Tipps und Hinweise wie immer dankbar

Alter Mann

himitsu 5. Sep 2009 19:34

Re: Ord für Int64
 
Wozu denn?

Ord ist doch schon ein Integer (ordinaler Type)

[edit]
abgesehn davon, seh ich da nirgendwo einen Int64 :gruebel:

[edit2]
das sind auch beises Char, also kann man diese auch direkt vergleichen

jaenicke 6. Sep 2009 07:11

Re: Ord für Int64
 
Aua!
Zitat:

Zitat von Alter Mann
Delphi-Quellcode:
    if GetLocaleInfo(GetUserDefaultLangID, LOCALE_STHOUSAND, S, SizeOf(PWideChar)) = 0 then S := '.';

Du übergibst ein Char (S) als Buffer, dieses ist 1 Byte (Delphi <= 2007) bzw. mind. 2 Byte (Delphi 2009/2010) groß. Als Größe übergibst du aber die von PWideChar, also einem Pointer. In einer 32-Bit-Architektur sind das immer 4 Byte.

Du sagst also GetLocaleInfo, dass du einen Buffer mit einer Größe von 4 Zeichen(!) übergibst, übergibst aber nur einen von 1 bzw. 2 Byte Größe...

Alter Mann 9. Sep 2009 07:53

Re: Ord für Int64
 
Peinlich :oops:

Aber wie immer, sehr Zielführend!

Mache es jetzt so:
Delphi-Quellcode:
function GetTC(IntStr : String) : Integer;
var
    I : Integer;
    S : Array[0..1] of Char;
begin
  Result := 0;
  if GetLocaleInfo(GetUserDefaultLangID, LOCALE_STHOUSAND, S, 2) = 0 then S[0] := '.';

  for I := 1 to Length(IntStr) do
    if Ord(IntStr[I]) = Ord(S[0]) then Inc(Result);
end;

himitsu 9. Sep 2009 10:05

Re: Ord für Int64
 
Delphi-Quellcode:
function GetTC(IntStr : String) : Integer;
var
    I : Integer;
    C : Array[0..1] of Char;
begin
  Result := 0;
  if GetLocaleInfo(GetUserDefaultLangID, LOCALE_STHOUSAND, @C, 2) = 0 then C[0] := '.';
  for I := 1 to Length(IntStr) do
    if IntStr[I] = C[0] then Inc(Result);
end;
Auch wenn der Compiler die ORDs quasi wegoptimiert ... es sind beides CHARs, also kann man diese direkt vergleichen

und der Compiler bemeckert das fehlende @ nicht?
(bei mir lpLCData ein PChar)

Alter Mann 9. Sep 2009 16:18

Re: Ord für Int64
 
Nö, das fehlende @ wird nicht angemeckert(D2K9).
Der Code wird so ähnlich in GetLocaleChar benutzt.

Gruß

himitsu 9. Sep 2009 16:30

Re: Ord für Int64
 
stümmt ... sehr intessant :shock:

weil eigentlich will die Funktion ja einen PChar und du gibst ein Array hin

Neutral General 9. Sep 2009 16:36

Re: Ord für Int64
 
Zitat:

Zitat von himitsu
stümmt ... sehr intessant :shock:

weil eigentlich will die Funktion ja einen PChar und du gibst ein Array hin

Nebenbei angemerkt:

Delphi-Quellcode:
var Arr: Array[0...10] of Char;
    s: String;
begin
  s := Arr;
end;
compiliert auch. Solange man das Array bei 0 beginnen lässt. Ansonsten meckert er rum.. Inkompatible Typen Array und String und so..

himitsu 9. Sep 2009 17:09

Re: Ord für Int64
 
bei Array zu String baut die Compilermagic für Strings eine entsprechende Konverter-Prozedur ein, also ist es da schon OK, nur für Array nach PChar war mir da noch nichts bekannt,

anscheinend tut der Compiler das @ automatisch davor, wenn Char-Array und PChar zusammenkommen.


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