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

1

27.12.2012, 16:46

map::find() Problem

Hallo,
mein Problem ist, dass ich einen gesuchten Key in der Map finden kann, obwohl er nicht drin ist. Klingt komisch, ist aber so.
Zu Erst rufe ich die Methode AddTexture auf. Ich übergebe den Dateipfad
und überprüfe dann, ob diese Textur schon geladen wurde. Wenn sie noch
nicht geladen wurd, also der Dateipfad in der Map nicht gefunden wurde,
sollte die Methode GetTexture NULL zurückgeben. Nachdem ich allerings
eine Textur hinzugefügt habe, gibt GetTexture nicht mehr NULL zurück,
auch wenn die Textur noch nicht geladen wurde.
Insgesamt sollten 37 Texturen geladen werden, es wurde aber nur eine geladen.

Ich weiß nicht wo das Problem ist. Hoffe mir kann jemand helfen.
Hier der Code:

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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
LPDIRECT3DTEXTURE9 CResourceManager::GetTexture(LPCSTR lpTextureName){
    std::map<LPCSTR, LPDIRECT3DTEXTURE9>::iterator result;
    result = m_MapTextures.find(lpTextureName);

    if(result == m_MapTextures.end())
    {
        MessageBox(0, "NULL", "RManager", MB_OK | MB_ICONINFORMATION);//melden, dass nichts gefunden wurde
        return NULL;
    }
    MessageBox(0, result->first, "RManager", MB_OK | MB_ICONINFORMATION);//den key ausgeben (es wurde was gefunden)
    return result->second;
}

void CResourceManager::AddTexture(LPCSTR lpFileName){
    LPDIRECT3DTEXTURE9 lpTexture = GetTexture(lpFileName);

    char debugBuffer[250];

    if(!lpTexture)
    {
        D3DXIMAGE_INFO ImageInfo;
        D3DXGetImageInfoFromFile(lpFileName, &ImageInfo);
        D3DXCreateTextureFromFileEx(m_lpD3DDevice,
                                    lpFileName,
                                    ImageInfo.Width,
                                    ImageInfo.Height,
                                    1,0,
                                    D3DFMT_UNKNOWN,
                                    D3DPOOL_MANAGED,
                                    D3DX_FILTER_NONE,
                                    D3DX_FILTER_NONE,
                                    0,0,0,
                                    &lpTexture);
        m_MapTextures[lpFileName] = lpTexture;
        
    //  sprintf(debugBuffer, "Hinzugefügt:\n%s", lpFileName);

    //  MessageBox(0, debugBuffer, "Meldung", MB_OK | MB_ICONINFORMATION);
    }
    else
    {
        sprintf(debugBuffer, "Nicht hinzugefügt:\n%s", lpFileName);
    //  MessageBox(0, debugBuffer, "Meldung", MB_OK | MB_ICONERROR);
    }
}


MfG
MazzMan.
Hi

2

27.12.2012, 17:08

Deine Map benutzt als Schlüssel Zeiger aus char-Arrays statt Strings.

Überleg dir mal 2 Dinge:
- Was passiert wenn ein LPCSTR kopiert wird? (Das wird er innerhalb der Map). Wem gehört der Speicher und wer gibt ihn frei?
- Was passiert, wenn 2 LPCSTR verglichen werden? Zeigervergleich/Inhaltsvergleich?

Als Konsequenz daraus: Immer und überall std::string benutzen. Solltest du jemals in eine Situation kommen, wo diese Vorgehensweise nicht sinnvoll ist, bist du entweder längst gut genug, solch einfach Regeln nicht mehr zu befolgen, weil du die Hintergründe verstanden hast, oder du hast dich mit dem Problem übernommen.

Also benutze mal konsequent std::string in deinem Programm und sag Bescheid, wenn der Fehler immernoch besteht.
Lieber dumm fragen, als dumm bleiben!

3

27.12.2012, 17:45

Nein, das geht so auch nicht. Ich habe LPCSTR beibehalten, aber den char-Array durch std::string ersetzt. Als ich std::string in LPCSTR konvertiert habe, hat es auch nicht funktioniert. Ich brauche LPCSTR für die DirectX Funktionen.
Hi

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

27.12.2012, 18:11

Wie Johnathan_Klein schon gesagt hat: Du brauchst eine std::map<std::string, IDirect3DTexture9*>...

5

27.12.2012, 18:29

Geht immernoch nicht. Wenn ich dann den std::string in LPCSTR umwandel kommt nur Müll raus.
Hi

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

6

27.12.2012, 18:32

Ich glaube sein Problem ist, dass std::string und LPCSTR nicht ohne weiteres kompatibel sind.
Du müsstest dir ein Typedef für einen TString machen:
typedef std::basic_string<TCHAR> tstring;
Dieser müsste dann über die c_str() Methode einen LPCSTR zurück geben.

Das ist aber nur eine Vermutung, da ich nie direkt mit der WinAPI arbeite(n würde).
Vielleicht kann jemand das ja bestätigen oder verbessern? :D
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

27.12.2012, 18:32

Wie genau wandelst du den std::string denn in einen LPCSTR um?

8

27.12.2012, 18:35

Mit c_str()
Hi

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

9

27.12.2012, 18:40

wenn du es mit c_str machst bekommst du erstmal eine Fehlermeldung, weil char* nicht in LPCSTR konvertiert werden kann. D.h. du castest einfach mit (LPCSTR)string.c_str() oder was?
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

10

27.12.2012, 18:46

Ich bekomme keinen Fehler. Aber in der MessageBox bekomme ich etwas komisches raus.

Zitat

str.c_str() gives you a const char *, which is an LPCSTR
Hi

Werbeanzeige