Variable ändert einfach ihre Adresse?
Variable ändert einfach ihre Adresse?
Bis gestern lief mein Programm noch blendend. Heute hab ich nur ne Kleinigkeit addiert. Das Programm arbeitet mit Threads die beim Beenden eine STOP Message bekommen (diese Variable wird nur ausgelesen und es gab bisher noch nie Probleme).
Ein Thread bekommt jetzt aber seine Stopmessage nicht mehr. Und nach ein bisschen suchen weiß ich auch warum:
Die Threads bekommen zum Start die Adresse des Messagestrings übergeben (globale Variable). Doch (und zwar nur beim beenden) plötzlich ändert sich diese Adresse einfach so. Der Thread liest jetzt natürlich nur noch Müll statt der richtigen Message.
Wie kann das sein daß eine (String) Variable plötzlich einfach so ihre Adresse ändert???
Ein Thread bekommt jetzt aber seine Stopmessage nicht mehr. Und nach ein bisschen suchen weiß ich auch warum:
Die Threads bekommen zum Start die Adresse des Messagestrings übergeben (globale Variable). Doch (und zwar nur beim beenden) plötzlich ändert sich diese Adresse einfach so. Der Thread liest jetzt natürlich nur noch Müll statt der richtigen Message.
Wie kann das sein daß eine (String) Variable plötzlich einfach so ihre Adresse ändert???
es ist eine globale Variable, ganz am Anfang definiert. Wie soll ich der denn eine neue Adresse zuweisen? Das einzigste was ich mir vorstellen könnte, ist daß PB den Speicherplatz und Ort bei jedem zuweisen eines Werts dynamisch verwaltet (ändert). Dann frag ich mich nur: warum ist das bisher nicht passiert?
Den Code zu posten wäre etwas lang, das sind schon weit über 3000 Zeilen. Und einfach ein paar Fragmente wären nicht gerade aussagefähig glaub ich.
Den Code zu posten wäre etwas lang, das sind schon weit über 3000 Zeilen. Und einfach ein paar Fragmente wären nicht gerade aussagefähig glaub ich.
Zuletzt geändert von Miao am 22.06.2005 14:29, insgesamt 1-mal geändert.
das stimmt so nicht, solange der thread nur lesend zugreift geht das ohne weiteres. das programm läuft jetzt bereits seit einem jahr ohne probleme, deswegen waage ich diese behauptung. nur jetzt bei einer kleinen erweiterung fängt der scheiß mit der adresse an.
und dabei hat die erweiterung noch nicht mal was mit dem thread zu tun
und dabei hat die erweiterung noch nicht mal was mit dem thread zu tun
- NicTheQuick
- Ein Admin
- Beiträge: 8808
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Ich glaube mich erinnern zu können, das PB einen String immer in 16-Bytes-Schritten allokiert.
Wenn du also erst einen String der Länge 15 (plus Nullbyte) hast und dann ein Zeichen addiert und im nachfolgenden Speicher ist kein Platz mehr, ändert der String seine Adresse, weil er dann an einem anderen Ort im Speicher abgelegt werden muss, wo mehr Speicherplatz vorhanden ist.
Und ich sehe gerade, dass ich mich geirrt habe. PureBasic allokiert den Speicher entweder immer in 8-Bytes-Schritten oder Windows allokiert den Speicher immer nur in Speichersegmenten, die durch 8 teilbar sind.
Hier der Test-Code, der das alles duetlich macht:
Wenn du also erst einen String der Länge 15 (plus Nullbyte) hast und dann ein Zeichen addiert und im nachfolgenden Speicher ist kein Platz mehr, ändert der String seine Adresse, weil er dann an einem anderen Ort im Speicher abgelegt werden muss, wo mehr Speicherplatz vorhanden ist.
Und ich sehe gerade, dass ich mich geirrt habe. PureBasic allokiert den Speicher entweder immer in 8-Bytes-Schritten oder Windows allokiert den Speicher immer nur in Speichersegmenten, die durch 8 teilbar sind.
Hier der Test-Code, der das alles duetlich macht:
Code: Alles auswählen
TestString.s = ""
For a.l = 1 To 100
TestString + Str(a % 10)
Debug RSet(Str(a), 3, "0") + " - " + RSet(Str(GlobalSize_(@TestString)), 3, "0") + " - " + Str(@TestString)
Next
- NicTheQuick
- Ein Admin
- Beiträge: 8808
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Ja, normalerweise sollte das so sein.Miao hat geschrieben:aber das hieße wenn der string immer gleichlang ist, bleibt er wo er ist, oder?
Aber ich würde dir sowieso empfehlen die Messages per LONG-Variable zu machen. Dann erstellst du dir in einer Enumeration eine Reihe von Konstanten, die für die entsprechenden Messages stehen und hast somit schon mal weniger Datenverkehr, weil immer nur 4 Bytes in den Threads verglichen werden müssen und es wird dann auch garantiert keine Speicheradressenfehler geben.
