Speicherverwaltung

Schnelle objektorientierte, kompilierende Programmiersprache.
nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Speicherverwaltung

Beitrag von nufan » So Dez 27, 2009 12:43 pm

Hast du das schon gesehen:
http://www.c-plusplus.de/forum/viewtopi ... 10303.html
Ist jedenfalls die gleiche Fehlermeldung. Sicher, dass du Speicher für die Struktur reserviert hast?

Uzaku
Beiträge: 55
Registriert: So Aug 09, 2009 1:47 pm

Re: Speicherverwaltung

Beitrag von Uzaku » So Dez 27, 2009 1:48 pm

Ja die Struktur auf die gezeigt wird existiert ja auch schon viel länger als der Zeiger.

Hie ist mal die Klasse:

Code: Alles auswählen

class Aim{
	public:
		Aim(){}
		~Aim(){}

		bool Angreifen(){return !((bool)curl_easy_perform(Connection));}
		
		string Name(){return name;}

		int Stufe(){return Werte[0];}
		int Kraft(){return Werte[1];}
		int Verteidigung(){return Werte[2];}
		int Geschicklichkeit(){return Werte[3];}
		int Ausdauer(){return Werte[4];}
		int Charisma(){return Werte[5];}
		
		void set_Werte(int Index, int Wert){Werte[Index] = Wert;}
		void set_Name(LPCSTR NName){name = NName;}
		void set_Connection(CURL *NCon){Connection = NCon;}
	
	private:
		int Werte[6];
		string name;
		CURL* Connection;

};
In der set_Connection Methode habe ich das ganze überprüft, da hat Connection die richtige adresse. Wenn ich dann fortfahre, und die Methode Angriff aufgerufen wird, dann ist auf einmal tote hose bei Connection.

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Speicherverwaltung

Beitrag von Dirty Oerti » Mo Dez 28, 2009 8:58 am

Wie sieht denn der Code aus? Was übergibst du der "Settermethode" ?
Es könnte sein, dass das, was du übergibst, dann, wenn du es übergibst schon seine Gültigkeit verloren hat (kommt es vom Stack?)
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Uzaku
Beiträge: 55
Registriert: So Aug 09, 2009 1:47 pm

Re: Speicherverwaltung

Beitrag von Uzaku » Mo Dez 28, 2009 10:33 am

Ich übergebe der Settermethode einen Zeiger auf ein CURL-Struct.
Das sollte auch seine Gültigkeit nicht verloren haben, weil die beinhaltende Klasse noch existieren sollte. Deswegen habe ich mir ja auch plötzlich gedanken über den private-Schutz von Klassen gemacht.
Das ist der Codeausschnit, in dem der Klasse die Werte zugewiesen werden. Das ganze is ja so geschrieben, dass es dann von Lua aus benutzt werden kann, die set-Methoden der Aim-Klasse sind dann von Lua aus nicht verfügbar.

Code: Alles auswählen

Aim *Opfer = new Aim;
	
	Pos = Buffer.find("Die Charakterwerte von ") + strlen("Die Charakterwerte von ");
	Length = Buffer.find("<", Pos) - Pos;
	
	Opfer->set_Name(Buffer.substr(Pos, Length).c_str());

	Pos = Buffer.find("Stufe:", Pos) + strlen("Stufe:");
	Pos = Buffer.find("tdn\">", Pos) + strlen("tdn\">");
	Length = Buffer.find("<", Pos) - Pos;
	Opfer->set_Werte(0, atoi(boost::replace_first_copy(Buffer.substr(Pos, Length), ".", "").c_str()));

	for(int i = 1; i < 6; i++){
		Pos = Buffer.find("small\">(", Pos) + strlen("small\">(");
		Length = Buffer.find(")", Pos) - Pos;
		Opfer->set_Werte(i, atoi(boost::replace_first_copy(Buffer.substr(Pos, Length), ".", "").c_str()));
	}

	string uja, ujc, ujp;
	Pos = Buffer.find("name=uja value=\"", Pos) + strlen("name=uja value=\"");
	Length = Buffer.find("\"", Pos) - Pos;
	uja = Buffer.substr(Pos, Length);

	Pos = Buffer.find("name=ujc value=\"", Pos) + strlen("name=ujc value=\"");
	Length = Buffer.find("\"", Pos) - Pos;
	ujc = Buffer.substr(Pos, Length);

	Pos = Buffer.find("name=ujp value=\"", Pos) + strlen("name=ujp value=\"");
	Length = Buffer.find("\"", Pos) - Pos;
	ujp = Buffer.substr(Pos, Length);

	sprintf(Post, "uja=%s&ujc=%s&ujp=%s&mcp=%i", uja.c_str(), ujc.c_str(), ujp.c_str(), generate_mcp());
	setopt(Connection, CURLOPT_POSTFIELDS, Post);

	Opfer->set_Connection(Connection);
	return Opfer;
Connection ins vom Typ CURL* und wird im Konstruktor so erzeugt:

Code: Alles auswählen

Connection = curl_easy_init();
EDIT:
Ich habe es jetzt nochmal anders versucht, ich habe im Konstrutor von Aim nen eigenes CURL handle erzeigt mit curl_Easy_init(). Und dann in der setter funktion ein memcpy gemacht:

Code: Alles auswählen

void set_Connection(CURL *NCon){memcpy(Connection, NCon, sizeof(NCon));}
Hat aber auch nicht funktioniert.

Uzaku
Beiträge: 55
Registriert: So Aug 09, 2009 1:47 pm

Re: Speicherverwaltung

Beitrag von Uzaku » Di Dez 29, 2009 11:19 am

Habe das Problem gefunden.
Der Zeiger mit dem ich dem Handle das Post gesetzt habe, war nur in der methode gültig, ich habe daran nicht gedacht, weil ich dachte, er würde die strings kopieren.
Habe es dann durch debuggen bis in die Tiefen von libcurl rausgefunden :)

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Speicherverwaltung

Beitrag von Dirty Oerti » Di Dez 29, 2009 12:14 pm

Der Fehler lag also hier .. ?

Code: Alles auswählen

      void set_Name(LPCSTR NName){name = NName;}
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Uzaku
Beiträge: 55
Registriert: So Aug 09, 2009 1:47 pm

Re: Speicherverwaltung

Beitrag von Uzaku » Di Dez 29, 2009 12:42 pm

Nein, der Fehler lag hier:

Code: Alles auswählen

    sprintf(Post, "uja=%s&ujc=%s&ujp=%s&mcp=%i", uja.c_str(), ujc.c_str(), ujp.c_str(), generate_mcp());
   setopt(Connection, CURLOPT_POSTFIELDS, Post);
Weil Post lokal war. Jetzt ist Post private-Member der BFCon klasse und bleibt somit bestehen.

Und diese Debugmeldung mit dem Stapel lag vermutlich daran, dass CURL nichts anderes als ein typedef void ist, und er es sich erst in seinen libcurl-Funktionen umcastet.

Antworten