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

Brummbaer

Frischling

  • »Brummbaer« ist der Autor dieses Themas

Beiträge: 31

Wohnort: Aachen

Beruf: Fachinformatiker Anwendungsentwicklung

  • Private Nachricht senden

1

25.11.2009, 09:47

TTF_OpenFont - Debug- Verhalten

Hallo zusammen!

Ich habe mir vor einiger Zeit das Buch zu Gemüte geführt und habe seitdem ich es durch hab diverse Erweiterungen am Spiel gemacht: Punkte, Lebensliste, Menü,...

Im Moment versuche ich mich am Speichern der Punkte in einer Highscoreliste. Das funktioniert so weit - allerdings möchte der geneigte Spieler natürlich auch seinen Namen eingeben.
Genau an dieser Stelle habe ich mir zwar eine Lösung überlegt, die aber leider (noch) nicht funktioniert. Das ist aber NICHT das Problem, in dem es in diesem Thread geht.

Das bereits vorgestellte Problem ist wahrscheinlich mit dem Debugger zu lösen - aber eben jener macht ein mir schier unlösbares Problem:

Wenn ich das Spiel als Debug- Build compiliere und ausführe (also die .exe starte), funktioniert alles einwandfrei.
Wenn ich aber den Debugger starte, verhält sich folgende Stelle anders:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
CText::CText (const char* cFontname, int size) 
{     

    m_pScreen = g_pFramework->GetScreen (); 
    TTF_Init ();
    m_pFont = TTF_OpenFont(cFontname, size); //liefert NULL


    if(!m_pFont)
        printf("TTF_OpenFont: %s\n", TTF_GetError());   
}


Der Font ist an der richtigen Stelle und wird auch einwandfrei geladen, wenn ich nicht den Debugger benutze - aber im Debug- Modus liefert der Konstruktor an der entsprechend markierten Stelle nichts zurück.

TTF_GetError() liefert leider nur ein recht nichtssagendes "Font <cFontname> konnte nicht geladen werden".
Wenn ich den Font dann später verwenden möchte, knallt das Programm natürlich in einen Fehler...


Ich hab leider nicht die geringste Ahnung, warum der Debugger sich anders verhält, aber vielleicht ist euch das Problem ja mal über den Weg gelaufen...
Bin jedenfalls für jede Hilfe dankbar!

Brummbaer Ende

Edit: ganz vergessen: ich benutze die Visual C++ Express Edition unter Windows XP.
Ich habe jetzt übrigens einen einfache IF- Anweisung um die Render- Funktion des Textes gepackt, damit der nicht auf den Fehler aufläuft; Text gibt er jetzt natürlich keinen mehr aus (zumindest im Debugging)...
Es gibt 10 Sorten von Menschen: die, die das Binärsystem kennen, und die, die es nicht kennen.

2

25.11.2009, 15:17

wird das Programm den im Debugging auch in demselben ordner ausgeführt wie sonst? ich meine mich zu erinnern, das das Visual Studio die programme standardmäßig nach /debug bzw. /release legt, dann aber beim start aus der IDe/Debugging im Projektverzeichnis ausführt. Das kann man afaik irgendwo in den Projekteinstellungen festlegen.

Brummbaer

Frischling

  • »Brummbaer« ist der Autor dieses Themas

Beiträge: 31

Wohnort: Aachen

Beruf: Fachinformatiker Anwendungsentwicklung

  • Private Nachricht senden

3

25.11.2009, 15:42

Schnell und unproblematisch! Vielen Dank für die Hilfe!!!

Ums nochmal für alle mit dem gleichen Problem genau zu erklären:

Über Projekt->Eigenschaften findet man unter den "Konfigurationseigenschaften->Debugging" das Arbeitsverzeichnis. Hier das Verzeichnis angeben, in dem der Debug- Build compiliert wird und schon funktioniert das Ganze!

Nochmal vielen Dank!

Brummbaer Ende
Es gibt 10 Sorten von Menschen: die, die das Binärsystem kennen, und die, die es nicht kennen.

Brummbaer

Frischling

  • »Brummbaer« ist der Autor dieses Themas

Beiträge: 31

Wohnort: Aachen

Beruf: Fachinformatiker Anwendungsentwicklung

  • Private Nachricht senden

4

17.12.2009, 14:16

Jetzt hab ich doch noch eine Frage zur Eingabe vom Spielernamen:

Eigentlich funktioniert es, das Problem besteht allerdings darin, dass am Ende ein X und ein Sonderzeichen (\002) eingefügt werden.
Für die Highscoreliste benutze ich eine Struktur:

C-/C++-Quelltext

1
2
3
4
5
struct S_Entry
{
     char Name[16];
     int  Score;
};


Folgender Funktionsanfang übernimmt nun einen Namen in die Struktur:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
void CHighscore::Insert (int Score)
{
    S_Entry Entry;

//--> Übernehmen des Namens [m_cName ist genauso wie Entry.Name deklariert]

    for (int i = 0; i < 17; i++) Entry.Name[i] = m_cName[i];
//--> Der Name steht (laut Debugger) wunderschön und ohne doofes Ende in Entry.Name


//--> Übernehmen der Punkte

    Entry.Score    = Score;
//--> Erst nach diesem Befehl findet man mit dem Debugger die oben beschriebene Zeichenfolge am Ende von Entry.Name

                < ..... > 
}


Ich nehme mal an, dass es sich hier um irgendein Trennzeichen handelt, dass die Felder der Struktur unterteilt - vor allem, weil sie an Entry.Name[16] sowie Entry.Name[17] stehen...

Das doofe ist nur, dass diese Zeichen ebenfalls abgespeichert und ausgegeben werden. Ich bin so langsam ratlos...

Brummbaer Ende
Es gibt 10 Sorten von Menschen: die, die das Binärsystem kennen, und die, die es nicht kennen.

5

17.12.2009, 17:05

Wie wärs mit sprintf oder std::string ?

Brummbaer

Frischling

  • »Brummbaer« ist der Autor dieses Themas

Beiträge: 31

Wohnort: Aachen

Beruf: Fachinformatiker Anwendungsentwicklung

  • Private Nachricht senden

6

18.12.2009, 11:38

String wäre jetzt vom Hintergrund ziemlich aufwendig... daher würde ich es eigentlich gerne umgehen... Hab trotzdem mal ein bisschen damit rumgespielt:

C-/C++-Quelltext

1
2
3
string sBuff = m_cName; //m_cName steht anschließend im Buffer


sprintf_s(Entry.Name, "%s", m_cName); //Entry.Name wird mit "(null)" gefüllt...


sprintf habe ich mal auf so eingebaut:

C-/C++-Quelltext

1
2
sprintf_s(Entry.Name, "%s", m_cName);
//for (int i = 0; i < 17; i++) Entry.Name[i] = m_cName[i];


Sobald das Programm an dieser Zeile ankommt, erfolgt folgende Fehlermeldung:

Zitat

Debug Assertion Failed!

Program: <Pfad zur .exe>
File: <Pfad zu "vsprintf.c">
Line: 244 <der sprintf_s- Befehl>

Expression: ("Buffer too small", 0)


Das es danach nicht weiter geht, brauch ich wohl nicht zu erwähnen...

Brummbaer Ende

Edit: auch wenn ich die Buffer- Größe mitgebe, klappt das bei sprintf_s nicht. sprintf hingegen liefert keine Fehlermeldung, aber dafür immer noch ein Sonderzeichen zum Abschluss...
Es gibt 10 Sorten von Menschen: die, die das Binärsystem kennen, und die, die es nicht kennen.

GR-PA

Treue Seele

Beiträge: 326

Wohnort: Daheim

Beruf: Faulenzer

  • Private Nachricht senden

7

18.12.2009, 13:35

Dein Problem liegt wahrscheinlich daran, dass der C-String m_cName kein abschließendes 0 hat. Zeig doch mal den Quelltext, der den Namen einliest und die Definition von m_cName.

Außerdem ist dieser Code

C-/C++-Quelltext

1
for (int i = 0; i < 17; i++) Entry.Name[i] = m_cName[i]; 

falsch da

C-/C++-Quelltext

1
char Name[16]; 

Name nur 16 Elemente hat und du versuchst dem 17. einen Wert zuzuweisen, was zu einer Speicherverletzung bzw. undefiniertem Verhalten führt.

btw: Warum verwendest du sprintf? Du willst doch einfach nur einen C-String kopieren, also verwende doch einfach strcpy(_s).
Signaturen werden überbewertet

8

18.12.2009, 13:39

Wobei auch noch zu erwähnen ist, dass die _s funktionen kein Teil der Standardbibliothek sind. (glaub ich gehört zu haben)

GR-PA

Treue Seele

Beiträge: 326

Wohnort: Daheim

Beruf: Faulenzer

  • Private Nachricht senden

9

19.12.2009, 12:24

Zitat

The strcpy_s function, proposed for standardisation in ISO/IEC TR 24731,is supported by the Microsoft C Runtime Library.and some other C libraries. [...]. It is also explicitly unsupported by some libraries, including the GLibc library. Warning messages produced by Microsoft's compilers suggesting programmers change strcpy and strncpy to this function have been speculated by some to be a Microsoft attempt to lock developers to its platform.


Quelle: http://en.wikipedia.org/wiki/Strcpy
Signaturen werden überbewertet

Werbeanzeige