Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Packed Records und Zeichenketten (https://www.delphipraxis.net/106344-packed-records-und-zeichenketten.html)

Reinhard Kern 9. Jan 2008 15:16

Re: Packed Records und Zeichenketten
 
Zitat:

Zitat von Neutral General
Achja... Kann den String nicht genau MaxInt Bytes groß machen...

Zitat:

[Error] Client.pas(24): Data type too large: exceeds 2 GB
:arrow: (quasi)

Delphi-Quellcode:
x := SizeOf(Record-String);
Text: array[1..MaxInt-x] of Char;

Niemand verschickt solche Daten "am Stück". Texte kann man zeilenweise verschicken, Binärdaten in Blöcken von 128 Bytes oder was geeignet ist. Meiner Ansicht nach ist ein String mit 2 GB in jedem Fall ein Fehler im Konzept.

Gruss Reinhard

Dax 9. Jan 2008 15:19

Re: Packed Records und Zeichenketten
 
Eben, deswegen wird der nie 2GB groß ;) Lies mal meinen Beitrag aber böse Tricks mit dem Speichermanager weiter oben.

Muetze1 9. Jan 2008 16:39

Re: Packed Records und Zeichenketten
 
Och, bei der Lösung ist man aber auch wieder eingeschränkt. Warum nicht einfach ein kleines Protokoll definieren? Beispiel:

1. Integer (4 Bytes) Länge der folgenden Zeichenkette
2. Zeichenkette in der Länge wie zuvor angegeben.

Delphi-Quellcode:
procedure SendString(AText: string);
var
  lLen: Integer;
begin
  lLen := length(AText);
  Socket.SendBuf(lLen, sizeof(lLen));
  if lLen > 0 then
    Socket.SendBuffer(AText[1], lLen);
end;
bzw. empfangen:

Delphi-Quellcode:
function ReceiveString: string;
var
  lLen: Integer;
begin
  Socket.ReceiveBuf(lLen, sizeof(lLen));
  if lLen > 0 then
  begin
    SetLength(Result, lLen);
    Socket.ReceiveBuf(result[1], lLen);
  end;
end;

Neutral General 9. Jan 2008 18:27

Re: Packed Records und Zeichenketten
 
@Muetze1: Klar. Aber das funktioniert nicht wenn der String in einem Record ist und man das ganze Record verschickt...

Dax 9. Jan 2008 18:48

Re: Packed Records und Zeichenketten
 
Der Sinn hinter einem solchen Protokoll ist ja auch, eben nicht den gesamten Record zu verschicken, sondern die einzelnen Komponenten.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:34 Uhr.
Seite 2 von 2     12   

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