Seite 1 von 2

Variable ändert einfach ihre Adresse?

Verfasst: 22.06.2005 12:38
von Miao
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???

Verfasst: 22.06.2005 14:05
von DrShrek
Liegt meist am Programmierer.
Wahrscheinlich weist Du selbst der Variable einen neuen Speicherbereich zu. Sorry ohne Code...schwer den Fehler einzugrenzen.

Verfasst: 22.06.2005 14:25
von Miao
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.

Verfasst: 22.06.2005 14:27
von DrShrek
Was für ein Typ ist die Variable (long, Array,LinkedList,...)

Verfasst: 22.06.2005 14:30
von Miao
String. Genau deswegen kann ich mir das vorstellen mit dem dynamischen Zuweisen. Aber es ist halt bisher noch nie passiert. Und den anderen Threadmessages passiert es auch nicht.

Kann man das rausfinden ob PB das so macht?

Verfasst: 22.06.2005 14:37
von bluejoke
Threads und Strings mögen sich nicht!

Verfasst: 22.06.2005 14:42
von Miao
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

Verfasst: 22.06.2005 14:42
von NicTheQuick
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:

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

Verfasst: 22.06.2005 14:45
von Miao
klingt logisch. ich frage mich nur warum es bei den anderen strings nicht passiert.
aber das hieße wenn der string immer gleichlang ist, bleibt er wo er ist, oder?

Verfasst: 22.06.2005 14:52
von NicTheQuick
Miao hat geschrieben:aber das hieße wenn der string immer gleichlang ist, bleibt er wo er ist, oder?
Ja, normalerweise sollte das so sein.

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. :allright: