Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

birdfreeyahoo

Alter Hase

  • »birdfreeyahoo« ist der Autor dieses Themas

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

1

01.09.2012, 02:01

Problem mit Strings

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

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

01.09.2012, 07:06

sprintf allokiert keinen Speicher. Du übergibst folglich eine ungültige Adresse.

Ich glaube generell solltest Du Dich aber wohl mal mit einem Kapitel zu Strings beschäftigen, da geht ja bei Dir einiges durcheinander, wenn ich Deine Vorschläge so durchlese... von wegen c_str() als Parameter für sprintf() und so...
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

3

01.09.2012, 11:10

Ja, du könntest beispielsweise stringstreams benutzen um dienen String zusammen zu bauen. Wenn man heute noch sprintf benutzt, braucht man schon einen guten Grund dafür.
Lieber dumm fragen, als dumm bleiben!

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

01.09.2012, 12:26

Hmm, du probierst dich an einem Multiplayer-Spiel, obwohl du noch nicht einmal das Konzept von Zeigern verstanden hast? Sieht mir nach einer schlechten Idee aus.

birdfreeyahoo

Alter Hase

  • »birdfreeyahoo« ist der Autor dieses Themas

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

5

01.09.2012, 16:19

Ich hab das schon verstanden und schon JAhre C++-Erfahrung. Ich werd mich jetzt dann mal eingehender mit dem Thema strings beschäftigen, da ich anscheinend etwas weit zurück bin ;)

Danke für eure Hilfe.

EDIT: Ich glaub ich war etwas müde und habe den + Operator überladen von std::String vergessen.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »birdfreeyahoo« (01.09.2012, 16:31)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

01.09.2012, 16:59

"Jahre Erfahrung" ist ganz klar nicht korrekt, sonst wäre Dir bewusst, was Du da mit c_str() als Parameter verbaut hast und was logischer Weise hätte übergeben werden müssen. Oder Du wärst so erfahren gewesen die Doku zu befragen. Etwas schon lange zu machen heißt eben leider nicht, dass man Erfahrung darin hat oder gar dass man gut darin ist.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige