AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Move und FillChar bei strings.

Ein Thema von Bjoerk · begonnen am 8. Jun 2014 · letzter Beitrag vom 10. Jun 2014
Antwort Antwort
Seite 2 von 3     12 3   
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#11

AW: Move und FillChar bei strings.

  Alt 8. Jun 2014, 20:18
Delphi-Quellcode:
function StrMove(Dest: PChar; const Source: PChar; Count: Cardinal): PChar;
begin
  Result := Dest;
  Move(Source^, Dest^, Count);
end;
Da kann man doch auch gleich Move(Source, Dest, Count) schreiben, oder?

My Problem is, ich wäß ned was (hier) als Count anzusetzen is?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Move und FillChar bei strings.

  Alt 8. Jun 2014, 20:23
Natürlich so, wie man es von C++ und Co. auch kennt.

Also das CharCount.


Drum sieht das seit Delphi 2009 in etwa so aus, seitdem das PChar kein PAnsiChar mehr ist.
Delphi-Quellcode:
{$IFNDEF NEXTGEN}
function StrMove(Dest: PAnsiChar; const Source: PAnsiChar; Count: Cardinal): PAnsiChar;
begin
  Result := Dest;
  Move(Source^, Dest^, Count * SizeOf(AnsiChar));
end;
{$ENDIF !NEXTGEN}

function StrMove(Dest: PWideChar; const Source: PWideChar; Count: Cardinal): PWideChar;
begin
  Result := Dest;
  Move(Source^, Dest^, Count * SizeOf(WideChar));
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 ( 8. Jun 2014 um 20:26 Uhr)
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#13

AW: Move und FillChar bei strings.

  Alt 8. Jun 2014, 20:45
Ok. Thanx. Dann kann man das aber so nicht machen (Integerüberlauf). Ich lass es jetzt sein.

Delphi-Quellcode:
function TMyStringList.MoveBytes(const Index: integer): integer;
var
  I: integer;
begin
  Result := 0;
  for I := Index to FCount - 1 do
    Inc(Result, Length(FItems[I]) * SizeOf(Char));
end;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Move und FillChar bei strings.

  Alt 8. Jun 2014, 21:32
Also vom Code her sieht es OK aus und sollte so auch funktionieren.

Aber wo werden da Bytes gemovet und wenn ja Welche?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#15

AW: Move und FillChar bei strings.

  Alt 8. Jun 2014, 22:27
Zuletzt hatte ich es so. Geht aber nicht. Bringt sogar gelegentlich EInavlidPointer AV.
Delphi-Quellcode:
function TMyStringList.Add(const Value: string): integer;
begin
  Result := FCount;
  Insert(Result, Value);
end;

function TMyStringList.MoveBytes(const Index: integer): integer;
var
  I: integer;
begin
  Result := 0;
  for I := Index to FCount - 1 do
    Result := Result + Length(FItems[I]) * SizeOf(Char);
end;

procedure TMyStringList.Insert(const Index: integer; const Value: string);
begin
  if FCount = FCapacity then
    Capacity := FCapacity + DeltaCapacity;
  if Index < FCount then
  begin
    Move(FItems[Index], FItems[Index + 1], MoveBytes(Index));
    // FillChar(FItems[Index], Length(FItems[Index]) * SizeOf(Char), 0);
    Finalize(FItems[Index]);
  end;
  FItems[Index] := Value;
  Inc(FCount);
end;

procedure TMyStringList.Delete(const Index: integer);
begin
  if Index < FCount - 1 then
  begin
    Move(FItems[Index + 1], FItems[Index], MoveBytes(Index));
    // FillChar(FItems[FCount - 1], Length(FItems[FCount - 1]) * SizeOf(Char), 0);
    Finalize(FItems[FCount - 1]);
  end;
  FItems[FCount - 1] := '';
  Dec(FCount);
end;
  Mit Zitat antworten Zitat
Insider2004
(Gast)

n/a Beiträge
 
#16

AW: Move und FillChar bei strings.

  Alt 9. Jun 2014, 07:04
Für was soll das alles gut sein? Nimm TStringList und fertig!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Move und FillChar bei strings.

  Alt 9. Jun 2014, 10:02
Delete:
Erst Freigeben (Finalize), und zwar das, was du löschst.
dann verschieben, was vor muß und das, was verschoben, aber nicht gelöscht wurde, leeren FillChar, sonst ist der Eintrag doppelt da und du hast somit die Referenzzählung zerschossen.
Oder das erst den zu Löschenden zuwischenspeichern (Move in ine Tempvariable), dann verschieben und den zu löschenden an letzter Stelle einfügen (Movo) und die TempVariable natürlich, wenn man dafür den OriginalTyp verwendete, ebenfalls Nullen, da dieses sonst auch doppelt ist.

Genauso beim Insert.


Fazit: Erst lernen wie eigentlich die Speicherverwaltung funktioniert und dann sich an soein Projekt rantrauen.

Oder du fummelst besser nicht an der Speicherverwaltung rum
Delphi-Quellcode:
procedure ArrayDelete(var Arr: TMyArray; Index: Integer);
var
  i: Integer;
begin
  for i := Index to High(Arr) - 1 do
    Arr[i] := Arr[i + 1];
  SetLength(Arr, Length(Arr) - 1);
end;
Oder du nutzt fertige Codes, welche sich darum kümmern, wie z.B. die generische TList<>.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#18

AW: Move und FillChar bei strings.

  Alt 9. Jun 2014, 11:12
Dann muß man den Index aber aussparen (***).

Und wie gesagt, ich laß den Blödsinn jetzt.

Delphi-Quellcode:
procedure TMyStringList.Delete(const Index: integer);
begin
  Dec(FCount); // ***
  if Index <= FCount then
  begin
    Finalize(FItems[Index]);
    if Index < FCount then
    begin
      Move(FItems[Index + 1], FItems[Index], (FCount - Index) * SizeOf(string));
      FillChar(FItems[FCount], Length(FItems[FCount]) * SizeOf(Char), 0);
    end;
  end;
  FItems[FCount] := '';
end;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Move und FillChar bei strings.

  Alt 9. Jun 2014, 11:35
Was ist denn FItems nun eigentlich?

Die Char-Größe muß man nur einrechnen, wenn sich die Große auf Chars bezieht.
Wenn sich das nur auf einen String-Pointer und nicht auf den String-Inhalt bezieht, dann hat das dort absolut nichts zu suchen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#20

AW: Move und FillChar bei strings.

  Alt 9. Jun 2014, 11:59
FItems: array of string; (Siehe auch #1)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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:08 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