AW: StrLCopy : Non VCL
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; |
AW: StrLCopy : Non VCL
Oder lstrcpyn (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; |
AW: StrLCopy : Non VCL
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; |
AW: StrLCopy : Non VCL
Wie nennt sich denn der echte "Integer" (dynamischer und potentieller 64-Bit-Integer) im Lazarus?
Kannst du mal mit lstrcpyn testen, was dabei raus kommt? |
AW: StrLCopy : Non VCL
Liste der Anhänge anzeigen (Anzahl: 1)
Ü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 |
AW: StrLCopy : Non VCL
Och, die Hinweise für C++ (ala man sollte Makros wie StringCchCopy verwenden) ignoriere ich grundsätzlich. :angle2:
@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; |
AW: StrLCopy : Non VCL
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
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:
http://www.delphipraxis.net/1163962-post21.html
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; |
AW: StrLCopy : Non VCL
Zitat:
maximal 7 Chars + #0 :stupid: (also, wenn man auf PChar-Funktionen zurückgreift) |
AW: StrLCopy : Non VCL
Als Teil eines Records entfällt #0.
|
AW: StrLCopy : Non VCL
Zitat:
Delphi-Quellcode:
Nur der Zielpuffer muß natürluch groß genug sein.
lstrcpyn( szOutBuffer, sModelNumber, SizeOf(sModelNumber) + SizeOf(sModelNumber[0]) );
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:39 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