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

Der Dude

Treue Seele

  • »Der Dude« ist der Autor dieses Themas

Beiträge: 73

Wohnort: Elleringhausen-City

Beruf: ITA

  • Private Nachricht senden

1

31.10.2004, 08:56

Map insert-Funktion

Morgen,
ich denke mal ihr seit auch schon alle wach und freut euch ebenfalls tierisch auf meine Probleme ;p - sollte das nicht der Fall sein, legt euch einfach nochmal hin.
Also ich habe habe List-Klasse, mit einem Map. Sieht folgendermaßen aus:

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
struct D3D_Info
{
int i; //... usw

};

class List
{
    public:
        List();
        ~List();
    
        void        insertData(int iIndex,D3D_Info Info);
        D3D_Info    getData(int iIndex);

        
    private:
        map<int,D3D_Info>           mD3D_Info;
        map<int,D3D_Info>           mD3D_pair;
        map<int,D3D_Info>::iterator D3D_iterator;
};

//Und eben noch die Funktionen:

void List::insertData(int iIndex,D3D_Info Info)
{
    mD3D_pair = make_pair(iIndex,Info);     //???

    mD3D_Info.insert(mD3D_pair);            //???

    return;
}

D3D_Info List::getData(int iIndex)
{
    //Kettenglied mit dem Index zurückgeben

    D3D_iterator = mD3D_Info.find(iIndex);      //Und hier soll auch ein Fehler sein?

    if(D3D_iterator != mD3D_Info.find(iIndex))
    {
        return (mD3D_Info[iIndex]);
    }
    else
    {
        D3D_Info    error;
        return (error);
    }
}


Kennt jemand von euch auch diesen Fehler?
error C2664: 'std::_Tree<_Traits>::_Pairib std::_Tree<_Traits>::insert(const std::_Tree<_Traits>::value_type &)': Konvertierung des Parameters 1 von 'std::map<_Kty,_Ty>' in 'const std::_Tree<_Traits>::value_type &' nicht möglich
with
[
_Traits=std::_Tmap_traits<int,D3D_Info,std::less<int>,std::allocator<std::pair<const int,D3D_Info>>,false>
]
and
[
_Kty=int,
_Ty=D3D_Info
]
and
[
_Traits=std::_Tmap_traits<int,D3D_Info,std::less<int>,std::allocator<std::pair<const int,D3D_Info>>,false>
]
error C2679: Binärer Operator '=': Es konnte kein Operator gefunden werden, der einen rechtsseitigen Operator vom Typ 'std::pair<_Ty1,_Ty2>' akzeptiert (oder keine geeignete Konvertierung möglich)
with
[
_Ty1=int,
_Ty2=D3D_Info
]

Wie immer freue ich mich über jede Antwort.

Mfg
Der Dude
"Wenn ich morgens doppelt so schnell über den Flur laufe, kann ich 2 Minuten länger schlaften!" - leider war es ein Irrtum.

Der Dude

Treue Seele

  • »Der Dude« ist der Autor dieses Themas

Beiträge: 73

Wohnort: Elleringhausen-City

Beruf: ITA

  • Private Nachricht senden

2

31.10.2004, 08:58

Heißt natürlich:

if(D3D_iterator != mD3D_Info.end())
"Wenn ich morgens doppelt so schnell über den Flur laufe, kann ich 2 Minuten länger schlaften!" - leider war es ein Irrtum.

helium

Treue Seele

Beiträge: 180

Wohnort: NRW, Burscheid (nahe Köln)

  • Private Nachricht senden

3

31.10.2004, 12:31

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
    private: 
        map<int,D3D_Info>            mD3D_Info; 
        // map<int,D3D_Info>            mD3D_pair; -- Falscher Typ!!!

        map<int,D3D_Info>::value_type mD3D_pair;
        map<int,D3D_Info>::iterator    D3D_iterator; // wofür hier definieren???

}; 

//Und eben noch die Funktionen: 

void List::insertData(int iIndex,D3D_Info Info) 
{ 
    mD3D_pair = make_pair(iIndex,Info);
    mD3D_Info.insert(mD3D_pair);

   /*
      verwendest du mD3D_pair auch irgendwo? Sonst würde ich das komplett raushauen und statdessen

   mD3D_Info[iIndex] = Info;

   schreiben!!!

   */
}


und dann zu der anderen Methode:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
D3D_Info List::getData(int iIndex)
{ 
    //Kettenglied mit dem Index zurückgeben 

    D3D_iterator = mD3D_Info.find(iIndex);
    if(D3D_iterator != mD3D_Info.find(iIndex))  // Test total sinnlos

    { 
        return (mD3D_Info[iIndex]); // wieso nochmal suchen lassen? Hast doch schon die Position

    } 
    else 
    { 
        D3D_Info    error; // Wie wäre es mit Exceptions?

        return (error); 
    } 
}


Richtig wäre:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
D3D_Info List::getData(int iIndex)
{ 
    //Kettenglied mit dem Index zurückgeben 

    D3D_iterator = mD3D_Info.find(iIndex);
    if(D3D_iterator != mD3D_Info.end())
    { 
        return (*D3D_iterator);
    } 
    else 
    { 
        return D3D_Info();  
        // oder

        // throw IrgendeineExceptionKlasse("Element not found");

    } 
}


und wieso ist ein getter nicht const???

Der Dude

Treue Seele

  • »Der Dude« ist der Autor dieses Themas

Beiträge: 73

Wohnort: Elleringhausen-City

Beruf: ITA

  • Private Nachricht senden

4

31.10.2004, 14:57

mmh, also mit den exception hast du natürlich recht wollte aber erstmal das grundgerüst am laufen haben. die funktion insert geht jetzt - vielen dank ;). Abbber die get funktion verstehe ich nicht von dir. geht leide auch nicht wenn ich so so kopiere.
sieht jetzt so aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
D3D_Info List::getData(int iIndex)
{
    D3D_iterator = mD3D_Info.find(iIndex);      
    
    if(D3D_iterator != mD3D_Info.end())
    {
        return (mD3D_Info[iIndex]);
    }
    else
    {
        D3D_Info error;
        return error; 
    } 
}

error C2582: Die Funktion 'operator =' ist in 'std::pair<_Ty1,_Ty2>' nicht verfügbar
with
[
_Ty1=const int,
_Ty2=D3D_Info
]

leider ist mir unklar wo das problem liegt. Könntest du es mir bitte erklären?

mfg
der dude
"Wenn ich morgens doppelt so schnell über den Flur laufe, kann ich 2 Minuten länger schlaften!" - leider war es ein Irrtum.

helium

Treue Seele

Beiträge: 180

Wohnort: NRW, Burscheid (nahe Köln)

  • Private Nachricht senden

5

01.11.2004, 12:39

Eine Map besteht aus lauter Paaren aus dem Schlüssel und dem eigentlich Wert. der Schlüssel ist dabei konstant. Deswegen können sie nicht gegenseitig zugewiesen werden.

Das klassenweit existierende mD3D_pair ist ein solches Paar. Ich würde es mal rauswerfen, da es scheinbar eh nicht benötigt wird, zumindest nicht in dem Code, den du gezeigt hast.
Die bessere Alternative steht im Kommentar in meinem letzten Beispiel.

---
Schonmal versucht eine Referenz zurückzugeben, statt das Objekt zu kompiren. Das sollte ebenfalls zu einer Lösung führen (fals ich jetzt alles richtig interpretiert habe.


Dann noch zu der Version von List::getData:
Du lässt mit find nach dem gewünschten Wert suchen. Dann speicherst du die Position in dem Iterator ab. Sollte eine gültige Position gefunden worden sein, verwendest du den operator[] um das Element zurückzuigeben.
Doch was machet der operator[]? Er sucht nach dem element und gibt s zurück. Moment mal, haben wir nicht gerade erst gesucht und uns die Position gemerkt? Doch, ja, richtig. Also lass uns doch einfach den Wert nehmen, der bei der Suche rauskam: Einfach den iterator dereferenzieren.

Also statt

C-/C++-Quelltext

1
return mD3D_Info[iIndex];


jetzt einfach:

C-/C++-Quelltext

1
return *D3D_iterator;



Hoffe ich kontte dir weiterhelfen :)

Der Dude

Treue Seele

  • »Der Dude« ist der Autor dieses Themas

Beiträge: 73

Wohnort: Elleringhausen-City

Beruf: ITA

  • Private Nachricht senden

6

01.11.2004, 12:55

Erstmal vielen dank helium,

aber:
"Doch was machet der operator[]? Er sucht nach dem element und gibt s zurück. Moment mal, haben wir nicht gerade erst gesucht und uns die Position gemerkt?"

Mit find gucke ich doch ob es überhaut ein solches paar gibt - was passiert wenn ich auf das paar zugereife und es ist nicht vorhanden? mmmh problem

ich habe es mal mit

C-/C++-Quelltext

1
return *D3D_iterator; 

versucht - möchte aber nicht funktionieren
error C2553: Unzulässige Konvertierung von Rückgabewert in Rückgabetyp 'D3D_Info'
error C2664: 'D3D_Info::D3D_Info(const D3D_Info &)': Konvertierung des Parameters 1 von 'std::allocator<_Ty>::value_type' in 'const D3D_Info &' nicht möglich
with
[
_Ty=std::pair<const int,D3D_Info>
]

kannst du mir sagen wieso es nciht geht?
mfg
der dude
;p
"Wenn ich morgens doppelt so schnell über den Flur laufe, kann ich 2 Minuten länger schlaften!" - leider war es ein Irrtum.

Werbeanzeige