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?
Speicherverwaltung
Re: Speicherverwaltung
Ja die Struktur auf die gezeigt wird existiert ja auch schon viel länger als der Zeiger.
Hie ist mal die Klasse:
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.
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;
};
- Dirty Oerti
- Beiträge: 2229
- Registriert: Di Jul 08, 2008 5:05 pm
- Wohnort: Thurndorf / Würzburg
Re: Speicherverwaltung
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?)
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.
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.
Re: Speicherverwaltung
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.
Connection ins vom Typ CURL* und wird im Konstruktor so erzeugt:
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:
Hat aber auch nicht funktioniert.
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;
Code: Alles auswählen
Connection = curl_easy_init();
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));}
Re: Speicherverwaltung
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
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

- Dirty Oerti
- Beiträge: 2229
- Registriert: Di Jul 08, 2008 5:05 pm
- Wohnort: Thurndorf / Würzburg
Re: Speicherverwaltung
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.
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.
Re: Speicherverwaltung
Nein, der Fehler lag hier:
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.
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);
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.