Variable ändert einfach ihre Adresse?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Miao
Beiträge: 25
Registriert: 09.09.2004 10:22

Variable ändert einfach ihre Adresse?

Beitrag 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???
Benutzeravatar
DrShrek
Beiträge: 1970
Registriert: 08.09.2004 00:59

Beitrag von DrShrek »

Liegt meist am Programmierer.
Wahrscheinlich weist Du selbst der Variable einen neuen Speicherbereich zu. Sorry ohne Code...schwer den Fehler einzugrenzen.
Siehste! Geht doch....?!
PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...
Miao
Beiträge: 25
Registriert: 09.09.2004 10:22

Beitrag 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.
Zuletzt geändert von Miao am 22.06.2005 14:29, insgesamt 1-mal geändert.
Benutzeravatar
DrShrek
Beiträge: 1970
Registriert: 08.09.2004 00:59

Beitrag von DrShrek »

Was für ein Typ ist die Variable (long, Array,LinkedList,...)
Siehste! Geht doch....?!
PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...
Miao
Beiträge: 25
Registriert: 09.09.2004 10:22

Beitrag 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?
Benutzeravatar
bluejoke
Beiträge: 1244
Registriert: 08.09.2004 16:33
Kontaktdaten:

Beitrag von bluejoke »

Threads und Strings mögen sich nicht!
Ich bin Ausländer - fast überall
Windows XP Pro SP2 - PB 4.00
Miao
Beiträge: 25
Registriert: 09.09.2004 10:22

Beitrag 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
Benutzeravatar
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

Beitrag 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
Miao
Beiträge: 25
Registriert: 09.09.2004 10:22

Beitrag 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?
Benutzeravatar
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

Beitrag 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:
Antworten