Für mein SPiel über NEtzwerk/Internet habe ich eine Konsole, die auf Befehle reagiert. Hier ist ein Ausschnitt des Ban-Befehls:
|
C-/C++-Quelltext
|
1
2
3
|
char* tmp;
sprintf(tmp,"Der Spieler %s wurde gebannt",player->name);
messageToClients(tmp);
|
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
Result GameState::messageToClients(const char* msg)
{
if(isServer)
{
RakNet::BitStream bsOut;
bsOut.Write((RakNet::MessageID)ID_MESSAGE_ALL);
bsOut.Write(msg);
m_pPeer->Send(&bsOut,HIGH_PRIORITY,RELIABLE_ORDERED,0,RakNet::UNASSIGNED_SYSTEM_ADDRESS,true);
return RES_OK;
}
else
{
return RES_NOPERMISSION;
}
}
|
Das Programm in diesem Zustand stürzt beim Banbefehl ab. Genauer gesagt, beim sprintf() Aufruf.
Als %s.Ersatz player->name.c_str() stürzt auch ab.
bsOut.Write erwartet const char* (oder char* /unsigned char*/wchar_t* aber unicode ist aus). messageToClients funktioniert soweit auch (wird noch von woanders aufgerufen).
Wenn ich aber folgendes mache:
|
C-/C++-Quelltext
|
1
2
|
std::string msg = "Ein Spieler wurde gebannt!";
messageToClients(msg.c_str());
|
funzt es perfekt. Die anderen Aufrufe verwenden auch alle c_str().
Allerdings brauche ich den Spielernamen.
Folgendes habe ich auch mal gemacht:
|
C-/C++-Quelltext
|
1
2
|
const char* msg = "Ein Spieler wurde gebannt!";
messageToClients(msg);
|
Nichts wurde ausgegeben, der Debugger sagte in der Funktion messageToClients, msg(Parameter) sei ein "<schlechtes Ptr>", also ein Nullzeiger.
Somit bin ich zum Schluss gekommen, dass nur c_str() als Parameter geht und ein sprintf auf ein char* fehlschlägt, wahrscheinlich weil ich %s mit einem std::string ersetze.
Ich weiß nicht mehr, was ich machen soll, folgendes kann ich aber:
-Player::name von std::string zu was anderem ändern
-Parameter der messageToClients Funktion ändern. const char* muss trotzdem nach bsOut.Write()
Ich hoffe jmd kann mir helfen
mfg