C++ fehler bei zugriff auf attribute

ulkbäär

Cadet 3rd Year
Registriert
Mai 2010
Beiträge
48
Hallo.
ich teste zZ ein wenig mit threads herum.
Später sollen Clientverbindungen die durch den Server gehalten werden, in ihren Puffer schreiben und dieser Server liest es dann aus. Aber das ist erstmal nebensächlich geworden, denn etwas recht einfaches funktioniert nicht mehr: das veränder eines einfachen string Attributes.
Im Konstruktor funktioniert es. tentry() wird zum thread erstellen aufgerufen und für dann die schleife() methode aus. so weit so gut. in der schleife() methode wird die id auch verändert, aber der buffer nicht.
in der zuweißungszeile schmiert das prog ab.
das ist für mich unverständlich, denn auf id kann schreiben zugegriffen werden und auf buffer nicht.
in meiner main erstelle ich ein Objekt und rufe dann tentry() auf.
Code:
Client* cli = new Client();
cli->tentry(&cli);

client.h:
Code:
#include <string>
#include <iostream>

class Client {
	private:
		static int amount;
		int id;
		void schleife();
	public:
		static void tentry(void* a);
		Client();
		string buffer;
		virtual ~Client();
};

client.cpp:
Code:
#include "Client.h"
int Client::amount = 0;

Client::Client() {
	amount++;
	buffer.append("foo"); //funktioniert
}

Client::~Client() {
}

void Client::tentry(void* a) {
	Client* p = static_cast <Client*> (a);
	p->schleife();

}

void Client::schleife() {
	char buf[10];
	id = amount;       //das funktioniert aber
	itoa(id, buf, 10);
	buffer = "foo2";  //funktioniert nicht mehr, auch per append nicht

}

jemand eine idee?
schonmal danke.
 
In deiner Main-Methode erzeugst du einen Pointer auf ein Client-Objekt, dereferenzierst ihn und schiebst das "nackte" Objekt, das du dabei erhältst, in tentry(). Dort versuchst du aber, es wiederum als Pointer anzusprechen - das geht schief, und weil die Benutzung von void* jegliche Typsicherheit zerhagelt, kann der Compiler dich auch nicht vorwarnen :)

Lange Rede, kurzer Sinn: Nimm das "&" in cli->tentry() weg, dann läuft es (zumindest bei mir in g++).
 
Zuletzt bearbeitet:
-.-

oh man, wieder bei sowas gefailed >.<

aber hey jetzt funktioniert es :D
dankeschöön
 
Keine Ursache :)

Wobei ich gerade bemerke, daß meine Erklärung auch nicht richtig war. Mit "&cli" referenzierst du den Pointer, hast dann also einen Zeiger vom Typ Client**, das du an tentry() übergibst und dort als Client* verwenden willst.

Und der Grund dafür, daß die Benutzung von amount nicht auch kaputtgeht, ist der, daß amount statisch ist und daher nicht über das Objekt angesprochen wird.
 
trotzdem geht es ;)
im thread kann in buffer geschrieben werden.

mein nächstes prob ist es jetzt, dass ich darauf nicht lesen zugreifen kann.
Code:
Client* cli[5];
//in der main schleife, vorher die threads erzeugt, dann versuch ich auszulesen
myBuffer.append(cli[i]->buffer);   //hier kracht es dann, in den buffer schreiben geht
(i ist eine laufvar durch das Client* array)

wüsste sonst nicht, wie ich auf das was in den threds erzeugt wird (eig daten empfangen, später dann) zureifen soll.

Edit:
die id ist aber objekt spezifisch, d.h. wenn es das objekt nicht kennen würde, dann müsste es da schon krachen.
 
Kracht das Auslesen von buffer oder der Aufruf von append()? Trenn die beiden doch mal und mach eine Konsolenausgabe dazwischen, dann siehst du's.
 
öhm, es wird daran liegen, dass ich das im threads laufen lasse ohne sie zu syncornisieren.
diesem problem hab ich mich jetzt mal zugewandt und werde es (hoffentlich) heute noch testen können.
bei append ging es kaputt. hab es aber auch schon per operator und push_back() mit gleichbleibendem erfolg versucht.
 
Zurück
Oben