AGB  ·  Datenschutz  ·  Impressum  







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

StrLCopy : Non VCL

Ein Thema von IronCobra · begonnen am 1. Nov 2005 · letzter Beitrag vom 29. Apr 2012
Antwort Antwort
Seite 2 von 3     12 3      
hathor
(Gast)

n/a Beiträge
 
#11

AW: StrLCopy : Non VCL

  Alt 28. Apr 2012, 00:23
Delphi-Quellcode:
function StrLCopy(Dest, Source: PChar; MaxLen: Cardinal): PChar;
var
  Count: Cardinal;
begin
  // copies a specified maximum number of characters from Source to Dest
  Result := Dest;
  Count := 0;
  While (Count < MaxLen) and (Source^ <> #0) do begin
    Dest^ := Source^;
    Inc(Source);
    Inc(Dest);
    Inc(Count);
  end;
  Dest^ := #0;
end;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.153 Beiträge
 
Delphi 12 Athens
 
#12

AW: StrLCopy : Non VCL

  Alt 28. Apr 2012, 01:44
Oder MSDN-Library durchsuchenlstrcpyn (Unit Windows)

@hathor: Deine Funktion vergißt die abschließende #0 mitzuzählen.
Delphi-Quellcode:
/// <description> copies a specified maximum number of characters from Source to Dest </description>
function StrLCopy(Dest, Source: PChar; MaxLen: NativeUInt): PChar;
begin
  Dec(MaxLen); // für die abschließende #0
  if NativeInt(MaxLen) < 0 then
    Exit(nil);
  Result := Dest;
  while (MaxLen > 0) and (Source^ <> #0) do begin
    Dest^ := Source^;
    Inc(Source);
    Inc(Dest);
    Dec(MaxLen);
  end;
  Dest^ := #0;
end;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#13

AW: StrLCopy : Non VCL

  Alt 28. Apr 2012, 04:55
Lazarus kennt NativeUInt und NativeInt nicht.

Geändert:

Dummerweise ist jetzt der String Firmware Rev kürzer - also ist meine Version richtig...
http://www.delphipraxis.net/1163962-post21.html

Delphi-Quellcode:
/// <description> copies a specified maximum number of characters from Source to Dest </description>
function StrLCopy(Dest, Source: PChar; MaxLen: UInt64): PChar;
begin
  Dec(MaxLen); // für die abschließende #0
  if Int64(MaxLen) < 0 then
    Exit(nil);
  Result := Dest;
  while (MaxLen > 0) and (Source^ <> #0) do begin
    Dest^ := Source^;
    Inc(Source);
    Inc(Dest);
    Dec(MaxLen);
  end;
  Dest^ := #0;
end;

Geändert von hathor (28. Apr 2012 um 05:02 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.153 Beiträge
 
Delphi 12 Athens
 
#14

AW: StrLCopy : Non VCL

  Alt 28. Apr 2012, 09:28
Wie nennt sich denn der echte "Integer" (dynamischer und potentieller 64-Bit-Integer) im Lazarus?

Kannst du mal mit MSDN-Library durchsuchenlstrcpyn testen, was dabei raus kommt?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (28. Apr 2012 um 09:42 Uhr)
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#15

AW: StrLCopy : Non VCL

  Alt 28. Apr 2012, 12:01
Übrigens: lstrcpyn function - MSDN schreibt:
Copies a specified number of characters from a source string into a buffer.
Warning Do not use.
Consider using StringCchCopy instead.

Bevor ich das mit LAZARUS testen kann (ist auf einem anderen Notebook) zeige ich mal den Code von der Borland Software Corporation:

Delphi-Quellcode:
function StrLCopy(Dest: PChar; const Source: PChar; MaxLen: Cardinal): PChar; assembler;
asm
        PUSH EDI
        PUSH ESI
        PUSH EBX
        MOV ESI,EAX
        MOV EDI,EDX
        MOV EBX,ECX
        XOR AL,AL
        TEST ECX,ECX
        JZ @@1
        REPNE SCASB
        JNE @@1
        INC ECX
@@1: SUB EBX,ECX
        MOV EDI,ESI
        MOV ESI,EDX
        MOV EDX,EDI
        MOV ECX,EBX
        SHR ECX,2
        REP MOVSD
        MOV ECX,EBX
        AND ECX,3
        REP MOVSB
        STOSB
        MOV EAX,EDX
        POP EBX
        POP ESI
        POP EDI
end;
---------------
FPC currently uses 32 bits (4 bytes) for integers, whether the machine is a 32-bit or 64-bit machine. This will cause code expecting an integer and a pointer to be the same size to fail as a 64-bit machine uses 64-bit pointers. To allow you to write portable code, the FPC system unit introduces the types PtrInt and PtrUInt which are signed and unsigned integer data types with the same size as a pointer.
http://wiki.freepascal.org/Integer
Miniaturansicht angehängter Grafiken
fpc_integer-types.jpg  

Geändert von hathor (28. Apr 2012 um 12:21 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.153 Beiträge
 
Delphi 12 Athens
 
#16

AW: StrLCopy : Non VCL

  Alt 28. Apr 2012, 12:17
Och, die Hinweise für C++ (ala man sollte Makros wie StringCchCopy verwenden) ignoriere ich grundsätzlich.


@hator: Tausch besser noch schnell das PChar durch PAnsiChar aus,
denn dieser Code ist definitiv nur für ANSI geeignet.


[add]
ASM > Pascal
Delphi-Quellcode:
function StrLCopy(Dest, Source: PAnsiChar; MaxLen: Cardinal): PAnsiChar;
var
  i: Cardinal;
begin
  if Byte(Dest) <> 0 then begin
    i := MaxLen;
    while Source^ <> #0 do begin
      Dest^ := Source^;
      Inc(Source);
      Inc(Dest);
      Dec(i);
    end;
    Inc(i);
  end;
  Dec(MaxLen, i);
  Source := Dest; // hier hab ich wohl irgendwas falsch übersetzt (ich versuch's später nochmal)
  Dest := Result; //
  Result := Source; //
{****
  i := MaxLen shr 2;
  while i > 0 do begin
    PLongWord(Dest)^ := PLongWord(Source)^;
    Inc(Source, 4);
    Inc(Dest, 4);
    Dec(i);
  end;
  i := MaxLen and 3;
  while i > 0 do begin
    Dest^ := Source^;
    Inc(Source);
    Inc(Dest);
    Dec(i);
  end;
*****}

  while MaxLen > 0 do begin
    Dest^ := Source^;
    Inc(Source);
    Inc(Dest);
    Dec(MaxLen);
  end;
{*****}
  Dest^ := #0;
end;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (28. Apr 2012 um 12:43 Uhr)
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#17

AW: StrLCopy : Non VCL

  Alt 28. Apr 2012, 17:06
Kannst du mal mit MSDN-Library durchsuchenlstrcpyn testen, was dabei raus kommt?
Bei der Firmware fehlt eine 1.
Das Array ist 8 Char gross - also sollten auch 8 Char zurückgegeben werden:
sFirmwareRevArray[0..7] of Char;

Ich verwende jetzt Move - das geht auch und FEHLERFREI!

Delphi-Quellcode:
procedure PrintIdSectorInfo( IdSector : TIdSector );
var szOutBuffer : Array [0..40] of Char;
begin
  with IdSector do
  begin
    ChangeByteOrder( sModelNumber, SizeOf(sModelNumber) ); // Change the WORD array to a BYTE array
    szOutBuffer[SizeOf(sModelNumber)] := #0;
// StrLCopy( szOutBuffer, sModelNumber, SizeOf(sModelNumber) );
// lstrcpyn( szOutBuffer, sModelNumber, SizeOf(sModelNumber) );
    System.Move(sModelNumber, szOutBuffer, SizeOf(sModelNumber) );
    Form1.label1.caption :='Model : ' + szOutBuffer ;

    ChangeByteOrder( sFirmwareRev, SizeOf(sFirmwareRev) );
    szOutBuffer[SizeOf(sFirmwareRev)] := #0;
// StrLCopy( szOutBuffer, sFirmwareRev, SizeOf(sFirmwareRev) );
// lstrcpyn( szOutBuffer, sFirmwareRev, SizeOf(sFirmwareRev) );
    System.Move(sFirmwareRev, szOutBuffer, SizeOf(sFirmwareRev) );
    Form1.label2.caption := 'Firmware Rev : ' + szOutBuffer ;

    ChangeByteOrder( sSerialNumber, SizeOf(sSerialNumber) );
    szOutBuffer[SizeOf(sSerialNumber)] := #0;
 // StrLCopy( szOutBuffer, sSerialNumber, SizeOf(sSerialNumber) );
 // lstrcpyn(szOutBuffer, sSerialNumber, SizeOf(sSerialNumber) );
    System.Move(sSerialNumber, szOutBuffer, SizeOf(sSerialNumber) );
    Form1.label3.caption := 'Serial Number : '+ szOutBuffer ;
  end;
end;
http://www.delphipraxis.net/1163962-post21.html
Miniaturansicht angehängter Grafiken
test-3.jpg  

Geändert von hathor (28. Apr 2012 um 17:36 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.153 Beiträge
 
Delphi 12 Athens
 
#18

AW: StrLCopy : Non VCL

  Alt 28. Apr 2012, 17:51
Zitat:
Das Array ist 8 Char gross - also sollten auch 8 Char zurückgegeben werden:
sFirmwareRevArray[0..7] of Char;
Falsch.
maximal 7 Chars + #0 (also, wenn man auf PChar-Funktionen zurückgreift)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#19

AW: StrLCopy : Non VCL

  Alt 28. Apr 2012, 17:54
Als Teil eines Records entfällt #0.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.153 Beiträge
 
Delphi 12 Athens
 
#20

AW: StrLCopy : Non VCL

  Alt 28. Apr 2012, 17:56
Als Teil eines Records entfällt #0.
Das wissen aber nicht diese Funktionen ... für die muß es immer mit einer #0 enden, da ausschließlich die #0 als Ende gilt.

lstrcpyn( szOutBuffer, sModelNumber, SizeOf(sModelNumber) + SizeOf(sModelNumber[0]) ); Nur der Zielpuffer muß natürluch groß genug sein.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (28. Apr 2012 um 18:02 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 22:11 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