PureBasics interner Umgang mit String-Variablen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

PureBasics interner Umgang mit String-Variablen

Beitrag von Ynnus »

Hallöchen,

folgendes, ich hab mir mal Gedanken gemacht, wie PB eigentlich die Strings verwaltet. Es ist ja so, dass es keinen richtigen Datentyp String gibt, sondern ein Strink in PB eigentlich ein Pointer auf ein Array von Byte-Variablen ist welche dann den jeweiligen Text enthalten. Also etwa so:

Code: Alles auswählen

string.s = "Hallo"
Soweit ich weiß, wird dabei jetzt ein "Pointer" erstellt welcher auf den Speicher weißt, wo sich folgende Byte aufhalten:

Code: Alles auswählen

'H' 'a' 'l' 'l' 'o'  '\n'
72  97 108  108  111   X
(Keine Ahnung was die terminierende 0 als ASCII ist...)

Somit wird ein Array mit 6 Stellen erstellt. (5 für Zeichen und eines für Terminierung)
Wenn jetzt ein zweiter String hinzu kommt und addiert werden soll, sieht es ja so aus:

Code: Alles auswählen

string.s = "Hallo"
string.s = string.s + "du"
Jetzt müsste das Array von 6 auf 8 Stellen erweitert werden. Vielleicht kein Problem, wenn der darauffolgende Speicher leer ist. Aber was ist, wenn die darauffolgenden Stellen besetzt sind? Also, das Array mit "Hallo" ist umgeben von anderen Daten. Wenn ich einen zweiten String hinzu addiere, was macht PB dann intern? Wird ein neuer Platz "gesucht" wo alle beiden Strings Platz haben und dann dort erstellt? Dann müsste der alte aufgeräumt, Pointer geändert und der neue neu zugewiesen werden. Dabei würde aber sicher ein paar Pointer danach falsch liegen, die sich noch auf die alte Stelle beziehen. Meine Frage ist daher, wie PB intern diese Strings handhabt. Oder wie Programmiersprachen so etwas allgemein machen.

Vielleicht kennt sich ja jemand damit aus?

Btw.: Ich vermisse das Theorie Forum. :(

mfg.

Sunny
Benutzeravatar
freedimension
Admin
Beiträge: 1987
Registriert: 08.09.2004 13:19
Wohnort: Ludwigsburg
Kontaktdaten:

Re: PureBasics interner Umgang mit String-Variablen

Beitrag von freedimension »

Sunny hat geschrieben:

Code: Alles auswählen

'H' 'a' 'l' 'l' 'o'  '\n'
72  97 108  108  111   X
(Keine Ahnung was die terminierende 0 als ASCII ist...)
Ähm, ich würde jetzt mal spontan sagen 0 ;)
Beginne jeden Tag als ob es Absicht wäre!
Bild
BILDblog
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: PureBasics interner Umgang mit String-Variablen

Beitrag von Kaeru Gaman »

freedimension hat geschrieben:
Sunny hat geschrieben:

Code: Alles auswählen

'H' 'a' 'l' 'l' 'o'  '\n'
72  97 108  108  111   X
(Keine Ahnung was die terminierende 0 als ASCII ist...)
Ähm, ich würde jetzt mal spontan sagen 0 ;)
er meint wohl das zeichen, was bei rauskommt.

und das ist garkeins, denn 0 ist nunmal der "Terminator" ;)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

>> Aber was ist, wenn die darauffolgenden Stellen besetzt sind?

Der Speicher wird vom OS dynamisch verwaltet. Geschieht zumindestens unter Windows vollautomatisch. Echte Speicheradressen haste sowieso nicht zur Verfügung. Sind alle nur Virtuell. Aber mit der illussion realer Speicheradressen läßt es sich doch schön Arbeiten :)

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag von Ynnus »

ts-soft hat geschrieben:>> Aber was ist, wenn die darauffolgenden Stellen besetzt sind?

Der Speicher wird vom OS dynamisch verwaltet. Geschieht zumindestens unter Windows vollautomatisch. Echte Speicheradressen haste sowieso nicht zur Verfügung. Sind alle nur Virtuell. Aber mit der illussion realer Speicheradressen läßt es sich doch schön Arbeiten :)

Gruß
Thomas
Wie wird es denn dann gemacht? Wenn man jetzt manuell eine String-Klasse schreiben möchte die soetwas verwaltet, also strings wie in PB erstellen und handeln kann.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Den Speicher ReAllokieren oder wie meinste das jetzt ?
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag von Ynnus »

Na ich meine, irgendwie muss man ja Platz schaffen um dort die restlichen 2 Byte-Werte reinzuschreiben. Also den Speicher an genau dieser Speicherstelle erweitern um 2 byte. Dazu lässt sich nicht zufälliger Weise der gleichnamige Befehl ReAllocateMemory() nutzen? :shock:
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Der ist dafür zuständig. Aber die MemoryID wird geändert. Ansonsten ist es in der Hilfe ja schön erklärt. In Wirklichkeit wird der Speicher ja nicht unbedingt vergrößert sondern wahrscheinlich neuzugewiesen. Darum brauchst Du Dich aber nicht zu kümmern, das macht Dein OS.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag von Ynnus »

Alles klar, dann werd ich das so mal versuchen. Dass ich da nicht drauf gekommen bin... Naja, ich dachte eben, dass es Probleme geben könnte, wenn der Speicher zugebaut ist von anderen Objekten. :mrgreen:
(Meine Frage bezog sich eigentlich auch nicht unbedingt auf PureBasic sondern mehr auf C. Seid mir nicht böse, dass ich euer Wissen nun nutzen werde um es in C zu verwenden. :D )
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Code: Alles auswählen

Procedure ReAllocateMem(ptrMem.l, Size.l)
  hMem.l = GlobalHandle_(ptrMem)
  GlobalUnlock_(hMem)
  GlobalReAlloc_(hMem, Size, #GMEM_MOVEABLE)
  ProcedureReturn GlobalLock_(hMem)
EndProcedure
Hab ich mal schnell zusammengeschustert, ohne anspruch auf richtigkeit

Kannste Dir dabei gleich die API ansehen

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten