Speicherbearbeitung
Speicherbearbeitung
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...
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...
-
- 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
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 :
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...
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...
Code: Alles auswählen
Signatur := nil;
Re: Speicherbearbeitung
TMemory ist in Synapse ein Pointer. Kannst du leicht zürückverfolgen mitTobse82 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?
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
Re: Speicherbearbeitung
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?
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?
Re: Speicherbearbeitung
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.
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.
-
- 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
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.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?
Code: Alles auswählen
Signatur := nil;
-
- 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
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.
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
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
-
- 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
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. )Socke hat geschrieben:Die Pascal Strings sind alle null terminiert.
-Michael