Speicherbearbeitung

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Tobse82
Beiträge: 6
Registriert: Do 25. Okt 2012, 10:16

Speicherbearbeitung

Beitrag von Tobse82 »

Hallo Leute


ich arbeite gerade an einer Socketproblematik in FreePascal.
Nun möchte ich eine Message zusammenbauen, die ich über den Socket raussenden kann, nur fehlen mir aktuell die Mittel um eine Message zu erzeugen.

Ich möchte z.b. einen Speicherbereich allokieren ( Getmem ? ), den erstmal direkt mit 0 beschreiben, dann hier und da das eine oder andere Zeichen schreiben.

Nimmt man da GetMem und Pointer, nimmt man bestimmte Stringklassen oder Chars? (Nullterminierte Strings kommen ja bei mir nicht infrage. Also entfallen vermutlich schonmal einige )

Nimmt man TMemoryStream? ( wenn ja, wie kann man da Speicher "ausnullen" ? )


Die Synapse-Funktion TBlockSocket::SendBuffer z.b. erwartet "TMemory" ... was das sein soll habe ich bis heute nicht herausgefunden, weil auch google dazu praktisch nichts findet.
Ist die Pascal-Community so klein, oder werden bestimmte Klassen einfach nicht verwendet, dass man dazu nix findet?


Ich bin normalerweise C-Quellcode gewohnt, wo man mit Speicher so ziemlich alles machen kann, einschließlich beliebige Casts usw ... Daher bin ich jetzt etwas verwirrt...

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Speicherbearbeitung

Beitrag von MAC »

Wenn du Meherere zeichen haben willst. Dann verwendet man in Pascal generell "string".
Der umgang damit, ist , wenn man aus C++ kommt, recht vereinfacht und leicht gestalltet. Mann muss sich nicht um die Speicherprobleme oder nullterminierung oder sonntige Terminierung kümmern.
Mit GetMem, ist glaub ich in Pascal nicht mehr die schöne feine Programierart :)

Darum schreibt einfach :

Code: Alles auswählen

var
   astr : string;
   x:pchar;
begin
astr := 'Hallo'; // Die Zeichen H, a , l , l, o werden in String eingeführt. Speichermannagement wird von pascall übernommen.
astr := astr + ' ';ein Leerzeichen wird hinzugefügt
astr += ':)'; // Smiley wird hinzugefügt
Form1.Caption := astr // In der Caption erscheint jetzt "Hallo :)"
astr[2] := 'P'; // das 2te Zeichen,  das "a" und nicht das "l" ! wird zum P geändert.
x := @astr[1]; // x ist ein Pointer auf das 1. Zeichen von astr (das H)   
inc(x) // wenn du es so gewohnt bist kannst du auch den Pointer vergrößern, entspricht     x++
astr := #0 + #2 + #3; // Der bisherige inhalt wird komplett geleert. Neuer inhalt sind die Steuerzeichen 0,2,3.
astr += char(42) // Wenn man mit dem Ascii code was hinzufügen will...
Windowsfunction(PChar(astr)); // Wenn man funktionen des Betriebssystem windows benutzt, so muss man meistens den String in einen Nullterminierten String umwandeln...
 
Als Alternative zu Synapse kann ich "Lnet" empfehlen. Da kann man auf jedenfall Strings versenden. TMemoryStream geht da glaub ich auch. TMemoryStream ist übrigenz mehr darauf gedacht wenn du irgendwelche bytewerte verschicken willst, es wäre also auch möglich...

Code: Alles auswählen

Signatur := nil;

Benutzeravatar
theo
Beiträge: 10928
Registriert: Mo 11. Sep 2006, 19:01

Re: Speicherbearbeitung

Beitrag von theo »

Tobse82 hat geschrieben: Die Synapse-Funktion TBlockSocket::SendBuffer z.b. erwartet "TMemory" ... was das sein soll habe ich bis heute nicht herausgefunden, weil auch google dazu praktisch nichts findet.
Ist die Pascal-Community so klein, oder werden bestimmte Klassen einfach nicht verwendet, dass man dazu nix findet?
TMemory ist in Synapse ein Pointer. Kannst du leicht zürückverfolgen mit
Kontextmenu auf der Procedure/Function oder dem Typen, dort "Suche Deklaration".

Synapse bietet auch :
SendString(Data: AnsiString);
SendBlock(const Data: AnsiString);

http://synapse.ararat.cz/doc/help/blcks ... SendBuffer

Tobse82
Beiträge: 6
Registriert: Do 25. Okt 2012, 10:16

Re: Speicherbearbeitung

Beitrag von Tobse82 »

Ihr sprecht beide Klassen wie "AnsiString" und "String" an. Aber sind das nicht alles intern Nullterminierte Strings?
Das Protokoll was ich zur Kommunikation nutzen muss, verwendet allerdings "\0" als Trennzeichen.

Wie würde ich Zeichenketten zusammenbauen, die ebensolche "\0" enthalten dürfen, ohne damit das Ende des Strings anzuzeigen?

Benutzeravatar
theo
Beiträge: 10928
Registriert: Mo 11. Sep 2006, 19:01

Re: Speicherbearbeitung

Beitrag von theo »

AnsiString ist keine Klasse, sondern ein eingebauter Typ.

AnsiString hat einen Längenindikator und man kann deshalb auch Chr(0) in ihm speichern.

PChar ist der nullterminierte Typ (C Kompatibilität)

Grundsätzlich gilt immer noch dieses hier: http://www.codexterity.com/delphistrings.htm obwohl es jetzt noch mehr Stringtypen gibt.

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Speicherbearbeitung

Beitrag von MAC »

Tobse82 hat geschrieben:Ihr sprecht beide Klassen wie "AnsiString" und "String" an. Aber sind das nicht alles intern Nullterminierte Strings?
Das Protokoll was ich zur Kommunikation nutzen muss, verwendet allerdings "\0" als Trennzeichen.

Wie würde ich Zeichenketten zusammenbauen, die ebensolche "\0" enthalten dürfen, ohne damit das Ende des Strings anzuzeigen?
Wie du schon gesagt hast, "string" ist ein Nicht Nullterminierter String. Genau deshalb kannst du auch alles reinschreiben. Jeden Byte mit nem wert von 0 bis 255. Evt, ich bin mir nicht sicher, was alles UTF8 kompatibel ist, sogar noch viel größere Werte als 255.

Code: Alles auswählen

Signatur := nil;

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Speicherbearbeitung

Beitrag von Socke »

Die Pascal Strings sind alle null terminiert. Da die Länge aber zusätzlich gespeichert wird, kannst du auch mitten in den String ein \0 einbauen. Die Länge kannst du mit Length(mystring) abfragen.

Die Unterschiede zwischen den einzelnen String-Typen schaut man am Besten im Language Reference Guide nach.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Speicherbearbeitung

Beitrag von mschnell »

Socke hat geschrieben:Die Pascal Strings sind alle null terminiert.
Nö. Eine Null terminiert sie nicht, deshalb lassen sie sich ja so schön auch für nicht druckbare Informationen "zweckentfremden". Es ist nur eine zusätzliche Null hinter dem offiziellen (durch die Länge definierten) Ende, damit C Funktionen sie lesen können. (Bei short-Strings, ist das - soweit ich weiß - nicht so. )

-Michael

Antworten