CopyMemoryString()

Anfängerfragen zum Programmieren mit PureBasic.
Martin66119
Beiträge: 282
Registriert: 03.01.2005 11:36

CopyMemoryString()

Beitrag von Martin66119 »

Guten abend,

folgenden Code habe ich im Netz gefunden. An sich verstehe ich das; wenigstens halb

Code: Alles auswählen

*MemoryID = AllocateMemory(5000) 

*Pointer = *MemoryID
CopyMemoryString("Hello", @*Pointer)
CopyMemoryString("World")

Debug PeekS(*MemoryID) 
Warum wird "HalloWorld" ausgegeben. Das hängt doch bestimmt daran, dass der String "Hallo" nicht mit dem NuLL-Zeichen abgeschlossen ist. Aber wie schließt man den String mit dem Nullzeichen ab?

__________________________________________________
Code-Tags hinzugefügt
08.05.2013
RSBasic
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: CopyMemorySting()

Beitrag von Kiffi »

<OT>
RSBasic hat geschrieben:Code-Tags hinzugefügt
@Martin66119: Jemand. der hier schon seit mehr
als 8 Jahren dabei ist, sollte nicht in jedem dritten
Posting die Code-Tags vergessen. Du solltest doch
eigentlich wissen, wie es geht. Ich bewundere
Rays Geduld...

</OT>
a²+b²=mc²
Martin66119
Beiträge: 282
Registriert: 03.01.2005 11:36

Re: CopyMemorySting()

Beitrag von Martin66119 »

Das stimmt, dass ich schon einige Jahre hier bin. Das einzige was ich aber mal gemacht hatte,ist über den Parallelport Datvon einem AD-Wandler einzulesen und eine Wandlung mit dem Strobe zu starten. Für den Zugriff auf den Port habe ich, ich glaube eine Lib hier aus dem Forum genutzt. Damals wollte ich nur Spannungen messen. Seit dieser Zeit habe ich eigentlich nichts mehr gemacht; aber Fragen gestellt.

Sorry für mein Unwissen.
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Re: CopyMemorySting()

Beitrag von dysti »

Also @Martin66119,
wenn du die Hilfe von PB für CoyMemoryString aufgerufen hättest, dann wäre folgendes zu lesen gewesen:
Mit Code-Tags:

Code: Alles auswählen

*String = Die Adresse des zu kopierenden Strings. Der String muss mit einem Null-Zeichen abgeschlossen ("null-terminiert") sein. Der String wird im PB String-Format erwartet.  
Das bedeutet, das deine Ausage -
Das hängt doch bestimmt daran, dass der String "Hallo" nicht mit dem NuLL-Zeichen abgeschlossen ist.
- total falsch ist.
Damit erledigt sich auch der zweite Teil deiner Überlegungen bzw. Frage.
Den Rest kannst du in der PB-Hilfe nachlesen.
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
Benutzeravatar
Sicro
Beiträge: 964
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: CopyMemoryString()

Beitrag von Sicro »

Martin66119 hat geschrieben:Warum wird "HalloWorld" ausgegeben.
Ich verstehe nicht, was dich daran verwundert.
Vielleicht das fehlende Leerzeichen? Dafür musst du schon selber sorgen, denn CopyMemoryString fügt keins ein.

Edit:
Achso, du wunderst dich warum das Nullzeichen hinter "Hello" nicht erhalten bleibt...
Zuletzt geändert von Sicro am 09.05.2013 19:09, insgesamt 1-mal geändert.
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Kevin
Beiträge: 236
Registriert: 11.06.2007 12:55

Re: CopyMemoryString()

Beitrag von Kevin »

Martin66119 hat geschrieben:Guten abend,

folgenden Code habe ich im Netz gefunden. An sich verstehe ich das; wenigstens halb

Code: Alles auswählen

*MemoryID = AllocateMemory(5000) 

*Pointer = *MemoryID
CopyMemoryString("Hello", @*Pointer)
CopyMemoryString("World")

Debug PeekS(*MemoryID) 
Warum wird "HalloWorld" ausgegeben. Das hängt doch bestimmt daran, dass der String "Hallo" nicht mit dem NuLL-Zeichen abgeschlossen ist. Aber wie schließt man den String mit dem Nullzeichen ab?
CopyMemoryString(*String, [*ZielMemoryID])
Wird *ZielMemoryID weggelassen, wird die Adresse des vorherigen Aufrufs verwendet. (Die Adresse vor dem Null zeichen) das Nullzeichen wird zusätzlich gesetzt wie folgender Code zeigt:

Code: Alles auswählen

*MemoryID = AllocateMemory(5000,#PB_Memory_NoClear) 
FillMemory(*MemoryID,5000,$ffffffff)
*Pointer = *MemoryID

Debug "vor dem kopieren: "+Hex(PeekC(*MemoryID+StringByteLength("Hello")))

CopyMemoryString("Hello", @*Pointer)

Debug "nach dem kopieren: "+Hex(PeekC(*MemoryID+StringByteLength("Hello")))

CopyMemoryString("World")

Debug "nach dem 2ten kopieren: "+Chr(PeekC(*MemoryID+StringByteLength("Hello")))

Debug PeekS(*MemoryID)
Ausgabe: hat geschrieben:vor dem kopieren: FFFF ; weil alles auf $FF durch FillMemory gesetzt wurde
nach dem kopieren: 0 ;das Nullzeichen
nach dem 2ten kopieren: W ;das 'W' von World
mfg
kevin
Martin66119
Beiträge: 282
Registriert: 03.01.2005 11:36

Re: CopyMemoryString()

Beitrag von Martin66119 »

Vielen vielen Dank,

nun klappt es.
Antworten