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

Anonymous

unregistriert

1

16.04.2005, 17:11

STL: Liste in Map

Hallo zusammen,

ich hier zur zeit ein echtes Problem : Ich habe eine map

C-/C++-Quelltext

1
static std::map<char*, std::list<LPDIRECT3DTEXTURE9>*> m_TextureMap;


In der ich Listen von Texturen Speichere.

Mein Problem ist jetzt: Am Ende des Spiels will ich die Texturen "releasen" sprich bei jeder Textur

C-/C++-Quelltext

1
->release()
aufrufen.

Dafür hab ich erst einen iterator für die Map erzeugt:

C-/C++-Quelltext

1
std::map<char*, std::list<LPDIRECT3DTEXTURE9>*>::iterator it;
.

Jetzt komme ich allerdings nicht weiter. :(

Soll ich jetzt einen 2. Iterator :

C-/C++-Quelltext

1
std::list<LPDIRECT3DTEXTURE9>::iterator it2;
machen oder wie kann ich auf jedes Element der Liste release() anwenden ?

Bin für jede Hilfe dankbar und wer mir hilft kriegt auch nen Keks :roll:

Ready

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

16.04.2005, 17:18

Erstens würde ich nicht char* nehmen, sondern std::string!
Beim Vergleichen von zwei char*-Werten werden nur die Zeiger verglichen, und nicht der String-Inhalt! Siehe hier:

C-/C++-Quelltext

1
2
char* test1 = "Hallo";
char* test2 = "Hallo";


Wenn Du jetzt schreibst "test1 == test2", dann muss nicht unbedingt true dabei rauskommen (es hängt vom Compiler ab, es gibt da was, das sich String-Pooling nennt). Also nimm std::string!

Und anschließend, probier's mal so:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
for(map<string, list<LPDIRECT3DTEXTURE9>*>::iterator i = m_TextureMap.begin();
    i != m_TextureMap.end(); i++)
{
    list<LPDIRECT3DTEXTURE9>* pList = i->second;
    for(list<LPDIRECT3DTEXTURE9>::iterator j = pList->begin(); j != pList->end(); j++)
    {
        (*j)->Release();
    }
}


Ist nicht getestet, aber so müsste es eigentlich gehen.

Anonymous

unregistriert

3

16.04.2005, 17:36

Hallo,

ah jetzt versteh ich was ich falsch gemacht hab :P
Ich dachte ich könnte das mithilfe eines Iterators machen.

Dafür kriegst du auch nen Keks :party012:

:)

Ready

Anonymous

unregistriert

4

16.04.2005, 18:18

Achja wegen dem String-Pooling : Ich arbeite mit der Compilereinstellung dass gleiche Strings auf den Selben Speicher zeigen. Allerdings würde mich interresieren wie du 2 Strings vergleichst ohne diese Compilereinstellung?

Ich würde eine Funktion machen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
bool stringcompare(char* string1, char* string2)
{
    bool bSame = true;
    int i = -1;

       do
       {
              i++;

             if(string1[i]!=string2[i]
                bSame = false;

        }while(string1[i] != '\0 || !bSame);

      return bSame;
}


Sprang mir nur grad so durch den Kopf : )

Ready

5

16.04.2005, 18:31

da gibts schon 2 funktionen:

strcmp & strncmp

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

16.04.2005, 23:15

Zitat von »"Anonymous"«

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
bool stringcompare(char* string1, char* string2)
{
    bool bSame = true;
    int i = -1;

       do
       {
              i++;

             if(string1[i]!=string2[i]
                bSame = false;

        }while(string1[i] != '\0 || !bSame);

      return bSame;
}

Es geht viel schneller und einfacher - die bSame-Variable ist überflüssig. Sobald sich zwei Zeichen unterscheiden, kannst Du sofort false zurückliefern, weil die Strings dann eh nicht mehr gleich sein können.

Zusätzlich zu strcmp und strncmp gibt es noch stricmp und strnicmp. Das sind "case-insensitive" Varianten, d.h. für sie sind "HALLO" und "hAlLo" gleich.

Anonymous

unregistriert

7

17.04.2005, 12:40

Morgen,

ja stimmt ist schneller :)

Wenn ich was nicht verstehe dann versuche ich immer es selber zu coden, auch wenn ich das Rad dann neu erfinde, hauptsache ich lerne was.

Bis dann

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

8

17.04.2005, 13:22

So müsste es dann gehen:

C-/C++-Quelltext

1
2
3
4
5
bool stringcompare(const char* s1, const char* p2)
{
    while(*s1 == *s2 && *s1 && *s2) s1++, s2++;
    return (!*s1 && !*s2) ? true : false;
}

Anonymous

unregistriert

9

17.04.2005, 17:47

C-/C++-Quelltext

1
2
3
4
5
6
template<typename T> inline const bool compare (const T* left, const T* right) 
{ 
    while (*left == *right && *left && *right) left++, right++; 

    return ((!*s1 && !*s2) != 0); 
}

Patrick

Alter Hase

Beiträge: 1 264

Wohnort: Düren

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

10

17.04.2005, 18:10

Möglichkeit 1:
Du benutzt string-objecte!

Möglichkeit 2:
Du benutzt strink-konstruktoren:

C-/C++-Quelltext

1
2
if (::std::basic_string<char>("hallo") == ::std::basic_string<char>("hallo"))
    NULL;


Möglichkeit 3:

C-/C++-Quelltext

1
2
if (!strcmp("Hallo", "Hallo")
    NULL;


Möglichkeit 4:
Template:

C-/C++-Quelltext

1
2
3
4
5
6
7
template<typename T> inline const bool compare (const T* left, const T* right) 
{ 
    while (*left == *right && *left && *right) 
        left++, right++; 

    return ((!*left && !*right) != 0); 
}


Falls Du kein ::std::basic_string benutzen kannst/darfst/sollst, würde ich persönlich die Templatevariante bevorzugen, da sie sogut für alles zu gebrauchen ist!

- Patrick

Werbeanzeige