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

Lemming

Alter Hase

  • »Lemming« ist der Autor dieses Themas

Beiträge: 550

Beruf: Schüler

  • Private Nachricht senden

1

25.10.2005, 17:32

std::string und 'H'

ich habe eine sehr seltsame entdeckung gemacht:
ich hab mir für texte und bilder und sowas nen OverlayManager geschrieben
der verwaltet diese overlays mit ner std::map<std::string,overlay>.
funktioniert alles prima, nur wenn ich nen string der mit 'H' anfängt eingebe, dann funktioniert dieses overlay nicht.
so name wie "New Game" oder so gehen ohne Probleme aber "Help" funzt nicht!
Jetzt ist meine Frage: Woran zum Geier liegt das? Was für ein Problem hat std::string mit 'H'???
Es gibt Probleme, die kann man nicht lösen.
Für alles andere gibt es C++...

Lemming

Alter Hase

  • »Lemming« ist der Autor dieses Themas

Beiträge: 550

Beruf: Schüler

  • Private Nachricht senden

2

30.10.2005, 15:52

warum weiß denn keiner ne antwort :(
Es gibt Probleme, die kann man nicht lösen.
Für alles andere gibt es C++...

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

30.10.2005, 16:27

Vielleicht wäre eine detailliertere Fehlerbeschreibung als "funzt nicht" angebracht?!

helium

Treue Seele

Beiträge: 180

Wohnort: NRW, Burscheid (nahe Köln)

  • Private Nachricht senden

4

30.10.2005, 17:09

Re: std::string und 'H'

Zitat von »"Lemming"«

ich habe eine sehr seltsame entdeckung gemacht:
ich hab mir für texte und bilder und sowas nen OverlayManager geschrieben
der verwaltet diese overlays mit ner std::map<std::string,overlay>.
funktioniert alles prima, nur wenn ich nen string der mit 'H' anfängt eingebe, dann funktioniert dieses overlay nicht.
so name wie "New Game" oder so gehen ohne Probleme aber "Help" funzt nicht!
Jetzt ist meine Frage: Woran zum Geier liegt das? Was für ein Problem hat std::string mit 'H'???

std::string hat keine Probleme mit 'H' und aus deiner Beschreibung lässt sich kein Problem erkennen. Wie wäre es mit etwas Code?
Why is 6 afraid of 7?
Because 7 8 9

Lemming

Alter Hase

  • »Lemming« ist der Autor dieses Themas

Beiträge: 550

Beruf: Schüler

  • Private Nachricht senden

5

30.10.2005, 19:12

danke für eure reaktion.
gut zur detailierteren beschreibung kann ich leider wirklich nicht viel mehr sagen, als das funtz nicht...

ich hab mit dieser map mein spielmenü gesteuert. während der initialisierung wurden auf ein und die selbe art und weise vier einträge hinzugefügt:
1."New Game", 2."Help", 3."Quit", 4."Help Text".
Angezeigt wurden aber nur die Einträge "New Game" und "Quit".

Ich bin das ganze im Debugger durchgegangen und in der map waren 4 einträge drin. Aber gerendert wurden die mit 'H' am anfang nicht.
Da map.find wenn es nichts findet das letzte element liefert, aber der "Help Text" auch nicht dargestellt wird kann es daran nicht liegen.

Wenn ich aber die Einträge in "elp" und in "elp Text" umbennene wird das menü vollständig dargestellt.

An der tbFont Klasse, die ich verwende kann es aber auch nicht liegen, denn die Texte die dargestellt werden fangen mit 'H' an, nur der key in der std::map scheint in irgendeiner form probleme mit dem 'H' zu haben.


code is kein prob (bitte nicht erschrecken, hab versucht es so klein wie möglich zu halten):

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// so werden die overlays zum overlaymanager hinzugefügt

    m_pFont = new tbFont;
    if(m_pFont->Init("Data\\IntroFont.tga", "Data\\IntroFont.tbf"))TB_ERROR("Fehler beim Laden von IntroFont.tbf", TB_ERROR);
    INSTANCE(COverlayManager).AddText("New Game", m_pFont, tbVector2(0.5f, 0.6f), "Neues Spiel", 
        TB_FF_RELATIVE | TB_FF_RELATIVESCALING | TB_FF_ALIGN_HCENTER | TB_FF_ALIGN_VCENTER);
//stünde hier 

//        INSTANCE(COverlayManager).AddText("Help", m_pFont, tbVector2(...), "Hilfe anzeigen",...) würde "Hilfe anzeigen" nicht im Menü stehen.

//mit "elp" wird der Text angezeigt

    INSTANCE(COverlayManager).AddText("elp", m_pFont, tbVector2(0.5f, 0.69f), "Hilfe anzeigen", 
        TB_FF_RELATIVE | TB_FF_RELATIVESCALING | TB_FF_ALIGN_HCENTER | TB_FF_ALIGN_VCENTER);
    INSTANCE(COverlayManager).AddText("Quit", m_pFont, tbVector2(0.5f, 0.78f), "Spiel beenden", 
        TB_FF_RELATIVE | TB_FF_RELATIVESCALING | TB_FF_ALIGN_HCENTER | TB_FF_ALIGN_VCENTER);
// selbes  problem auch hier

    INSTANCE(COverlayManager).AddText("elp Text", m_pFont, tbVector2(0.7f, 0.6f), "\"Neues Spiel\" drücken!\nEnter zum Verlassen der Hilfe",
        TB_FF_RELATIVE | TB_FF_RELATIVESCALING | TB_FF_ALIGN_HCENTER | TB_FF_ALIGN_VCENTER);

dann noch zur funktionsweise des overlay managers:

diese struktur kapselt ein overlay

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct S_OVERLAY {
    OverlayType         otType; // textur oder text

    BOOL                bEnabled; // anzeigen oder nicht

    union {
        struct{
                     // was man so für eine textur braucht

        };
        struct {
            tbFont*     fFont;
            char*       pcText;
                        // ... noch anderes zeug, das man für tbFont braucht

        };
    };
};

das ist der overlay manager

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
class COverlayManager : public CObject, public CSingleton<COverlayManager>
{
public: 
        // ...

    tbResult AddText(std::string name, tbFont *fFont, tbVector2 vPosition, const char* pcText/*...*/);
    tbResult EnableOverlay(std::string name, BOOL bEnabled=TRUE);
        // ...

protected:
        // hier werden die overlays gespeichert

    std::map<std::string, S_OVERLAY> m_overlays;

Die funktion Enable Overlay

C-/C++-Quelltext

1
2
3
4
tbResult COverlayManager::EnableOverlay (std::string name, BOOL bEnabled) {
    m_overlays.find(name)->second.bEnabled = bEnabled;
    return TB_OK;
}

Die render funktion

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
tbResult COverlayManager::Render (float fTime)
{
    std::map<std::string, S_OVERLAY>::iterator itr;
    for(itr=m_overlays.begin();itr!=m_overlays.end();itr++) {
        if(itr->second.bEnabled)        {
            switch(itr->second.otType)          {
            case OT_PICTURE:
                                // rendere die textur

                break;
            case OT_TEXT:
                tbDirect3D::Instance().SetRS(D3DRS_ZENABLE, D3DZB_FALSE);
                itr->second.fFont->Begin();
                itr->second.fFont->DrawText(itr->second.vPosition,
                      itr->second.pcText/*...*/);
                itr->second.fFont->End();
                break;
            default:
                TB_ERROR("Nicht definiertes Overlay!", TB_ERROR);
                break;
            };
        }
    }
    return TB_OK;
}

im menü erfolgt ein einfacher aufruf von enable overlay:

C-/C++-Quelltext

1
2
3
4
5
6
// vereinfachte version

        INSTANCE(COverlayManager).EnableOverlay("New Game", TRUE);
        INSTANCE(COverlayManager).EnableOverlay("elp", TRUE);
        INSTANCE(COverlayManager).EnableOverlay("Quit", TRUE);
                // keine panik, das FALSE ist absicht, der Hilfe Text soll erst angezeigt werden, wenn benötigt.

        INSTANCE(COverlayManager).EnableOverlay("elp Text", FALSE);


ich hoffe diese beschreibung ist verständlicher. hab versucht den code weitestgehend auf das minimum zu beschränken.
vielen dank im voraus..
Es gibt Probleme, die kann man nicht lösen.
Für alles andere gibt es C++...

helium

Treue Seele

Beiträge: 180

Wohnort: NRW, Burscheid (nahe Köln)

  • Private Nachricht senden

6

31.10.2005, 16:05

Zitat von »"Lemming"«

ich hab mit dieser map mein spielmenü gesteuert. während der initialisierung wurden auf ein und die selbe art und weise vier einträge hinzugefügt:
1."New Game", 2."Help", 3."Quit", 4."Help Text".
Angezeigt wurden aber nur die Einträge "New Game" und "Quit".

Ich bin das ganze im Debugger durchgegangen und in der map waren 4 einträge drin. Aber gerendert wurden die mit 'H' am anfang nicht.
Da map.find wenn es nichts findet das letzte element liefert, aber der "Help Text" auch nicht dargestellt wird kann es daran nicht liegen.

Falsch. map.find liefert einen iterator, der hinter das letzte Element zeigt!!!

Zitat von »"Lemming"«


Wenn ich aber die Einträge in "elp" und in "elp Text" umbennene wird das menü vollständig dargestellt.

Das ist wirklich interessant. gibt es auch mit anderen Buchstaben probleme, oder nur mit dem 'H'.

Zitat von »"Lemming"«


An der tbFont Klasse, die ich verwende kann es aber auch nicht liegen, denn die Texte die dargestellt werden fangen mit 'H' an, nur der key in der std::map scheint in irgendeiner form probleme mit dem 'H' zu haben.

Hast du testweise mal dei Map ausgegeben

C-/C++-Quelltext

1
2
3
for (std::map<std::string, S_OVERLAY>::const_iterator it=m_overlays.begin(); it !=m_overlays.end; ++it) {
   einFilestream << it->first << '\n';
}


----------

C-/C++-Quelltext

1
2
3
4
5
tbResult COverlayManager::EnableOverlay (std::string name, BOOL bEnabled) {
      
    m_overlays.find(name)->second.bEnabled = bEnabled;
    return TB_OK;
}


Gefährlich, gefährlich!

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
tbResult COverlayManager::EnableOverlay (std::string name, BOOL bEnabled) {
   std::map<std::string, S_OVERLAY>::iterator it =m_overlays.find(name);
   if (it != m_overlays.end()) { // ist es überhaupt da?

      it->second.bEnabled = bEnabled;
      return TB_OK;
   }
   else
      throw "Es wurde versucht auf ein Element zuzugreifen, das garnicht existiert.";
}


Übergib Strings lieber als "const &". und verwende die Präfixvariante des ++-Operators, da die andere deutlich zeitaufwendiger ist, vor allem bei std::map.


Zitat

im menü erfolgt ein einfacher aufruf von enable overlay:

C-/C++-Quelltext

1
2
3
4
5
6
// vereinfachte version

        INSTANCE(COverlayManager).EnableOverlay("New Game", TRUE);
        INSTANCE(COverlayManager).EnableOverlay("elp", TRUE);
        INSTANCE(COverlayManager).EnableOverlay("Quit", TRUE);
                // keine panik, das FALSE ist absicht, der Hilfe Text soll erst angezeigt werden, wenn benötigt.

        INSTANCE(COverlayManager).EnableOverlay("elp Text", FALSE);

Hast du bei deinen Versuchen auch immer bei beiden Funktionen, also beim Hinzufügen und beim "enablen" "elp" in "Help" geändert? Nicht, dass du ausversehen mal eins vergessen hast.
Why is 6 afraid of 7?
Because 7 8 9

Lemming

Alter Hase

  • »Lemming« ist der Autor dieses Themas

Beiträge: 550

Beruf: Schüler

  • Private Nachricht senden

7

31.10.2005, 16:39

Zitat von »"helium"«


Falsch. map.find liefert einen iterator, der hinter das letzte Element zeigt!!!

jaja das weiß ich auch, aber ich denke es is relativ klar, dass in der stl das meiste mit iterators gemacht wird...

Zitat von »"helium"«


Das ist wirklich interessant. gibt es auch mit anderen Buchstaben probleme, oder nur mit dem 'H'.

nein mit anderen buchstaben hat ichs noch nicht probiert. ich kann mich aber daran erinnern in ner console(CS 1.5 style) die ich mir mal mit der stl geschrieben hatte auch probleme mit dem großen 'H' und nur mit dem gehabt zu haben.

Zitat von »"helium"«


Hast du testweise mal dei Map ausgegeben

nein hab ich nicht, aber ich hab mir die map im debugger angsehen und da stand "Help". Deswegen hab ich nich die geringste vorstellung, was es mit diesem problem auf sich hat.

Zitat von »"helium"«


C-/C++-Quelltext

1
2
3
4
5
tbResult COverlayManager::EnableOverlay (std::string name, BOOL bEnabled) {
     
    m_overlays.find(name)->second.bEnabled = bEnabled;
    return TB_OK;
}

Gefährlich, gefährlich!

ok das klingt vernünftig, werd ich ändernd

Zitat von »"helium"«


Übergib Strings lieber als "const &". und verwende die Präfixvariante des ++-Operators, da die andere deutlich zeitaufwendiger ist, vor allem bei std::map.

interessant das wusste ich nich, werd ich auch ändern

Zitat von »"helium"«


Hast du bei deinen Versuchen auch immer bei beiden Funktionen, also beim Hinzufügen und beim "enablen" "elp" in "Help" geändert? Nicht, dass du ausversehen mal eins vergessen hast.

an tippfehlern lag es nicht, dazu hab ich das zu oft überprüft...
außerdem stand da ja ursprünglich "Help", "elp" hab ich erst draus gemacht, als es nicht funktioniert hat.
Es gibt Probleme, die kann man nicht lösen.
Für alles andere gibt es C++...

Werbeanzeige