map lässt sich nicht ausgeben.



  • lulu32 schrieb:

    das geht aber nicht:

    // main.cpp
    map<string,vector<string>> mymap;
    
    funktion(&mymap);
    
    // funktionsdeklaration
    
    void funktion(*mymap)
    {
      mymap["1"]->push_back("bla"); //es geht nicht!!
    }
    

    das wird aber auch mit einem vector nicht funktionieren. Schau dir doch nochmal an, wie eine Funktionssignatur auszusehen hat.



  • hmm tut mir leid ich verstehe nur noch bahnhof, entweder ich mach irgendwo nen dicken fehler oder ich schalt komplett aus:

    // das hier ist meine funktion
    void checkContentOfDir(string strInPath, vector<string> *list, int *zaehler, map<string,vector<string>> &mymap ) // ACHTUNG mymap hat & und nicht *
    	{
    list->push_back("bla"); // funktioniert einwandfrei
    mymap["ddf"].push_back("bla"); // funktioniert auch
    
    // aber warum geht es nicht das ich oben *mymap machen und dann
     mymap["ddf"]->push_back("bla"); // das geht einfach nicht
    }
    
    // in der main sieht es so aus:
    
            int i;
    	i=0;
    
    	vector<string> dervektor;
    	map<string,vector<string>> mymap;
             string pfad;
    	pfad = "C:\\Program Files\\GIMP 2\\";
    
    checkContentOfDir(pfad, &dervektor, &i, mymap); // auch hier &mymap geht nicht.... er will mymap
    

    // edit

    also wenn ich es so mache wie beim vektor dann kann ich nur

    // z.b. das hie rmachen
    mymap->find();
    
    ich weiß aber nicht wie ich den dann befüllen soll...
    


  • Mir ist zwar nicht klar warum du hier überhaupt mit Zeigern arbeitest, aber dir fehlt wohl ein großes Verständnis wie Operatoren arbeiten. std::map hat die Methode "operator[]", aber nicht ein Zeiger auf eine map (Ein Zeiger hat keine Methoden).

    // Wenn mymap nun als Zeiger übergeben wurde:
    (*mymap)["ddf"].push_back("bla");
    


  • wo hab ich denn ein problem mit zeigern?

    ich erstelle im hauptprogramm eine variable und will mit der funktion auf dieser variable ackern. also erstelle ich doch eine funktion die einen pointer will...

    so jetzt:

    // funktion 1
    void function1(vector<string> *list)
    {
       list->push_back("blabla");
    }
    
    //main
    int main()
    {
    vector<string> *alist;
    
    function1(&alist);
    cout << alist[1] << endl; // gibt blabla aus!
    
    return 0;
    }
    

    Bis hier hin habe ich doch richtig gearbeitet? Oder etas nicht?

    So jetzt gehts zur map

    // funkion 2 mit map
    
    function2(map<string,vector<string>> *mymap)
    {
    mymap["1"]->push_back("blabla"); // geht nicht
    mymap->find("xy");                      // geht schon, ich weiß also nicht wie ich den ganzen käse befüllen soll, hier liegt der wurm wahrscheinlich weil es bei ner map durch mymap["1"] eben durch das erste element wohl anderst wird?
    }
    
    //main
    int main()
    {
    map<string,vector<string>> amap;
    
    function2(&amap);
    
    return 0;
    }
    

    Ich habe es jetzt so gemacht, das müsste doch auch sauber programmiert sein?

    // funktion 3 mit referenz
    void function3(map<string,vector<string>> &mymap)
    {
       mymap["1"]->push_back("blaba");
    }
    
    // main
    int main()
    {
    map<string,vector<string>> amap;
    
    function2(&amap);
    return 0;
    }
    

    Ich hab mir schon x-mal pointer angesehen und hab es eigentlich auch verstandne, nur verstehe ich hier das problem nicht, warum es nicht geht.



  • Wäre schön wenn du dir wenigstens mein Beispiel angeschaut hättest. Dann würdest du vielleicht auch verstehen...



  • lulu32 schrieb:

    Ich habe es jetzt so gemacht, das müsste doch auch sauber programmiert sein?

    Zeig doch mal die Fehlermeldungen, die der Compiler dazu ausgibt. Da sollte eigentlich drinstehen, wo die Fehler liegen.

    lulu32 schrieb:

    Ich hab mir schon x-mal pointer angesehen und hab es eigentlich auch verstandne, nur verstehe ich hier das problem nicht, warum es nicht geht.

    1. Weißt du, was eine Referenz ist? Und weißt du, wie man ein Objekt "als Referenz" übergibt?

    2. Du hast eine std::map<string, vector<string>> und keine std::map<string, vector<string>*>



  • asc schrieb:

    Wäre schön wenn du dir wenigstens mein Beispiel angeschaut hättest. Dann würdest du vielleicht auch verstehen...

    Ich finde es ja nett das ihr mir helfen wollt, aber damit eher nicht. Ich studiere jetzt auch schon über 2 Jahre Informatik und weiß schon wie ich vorzugehen habe, wenn ich was nicht verstehe.
    Und beim Programieren brauch ich persönlich immer Beispiele um es zu verstehen von dem her hab ich mir einigige beispiele angeschaut!!!!!!!

    daddy_felix schrieb:

    lulu32 schrieb:

    Ich habe es jetzt so gemacht, das müsste doch auch sauber programmiert sein?

    Zeig doch mal die Fehlermeldungen, die der Compiler dazu ausgibt. Da sollte eigentlich drinstehen, wo die Fehler liegen.

    1. Weißt du, was eine Referenz ist? Und weißt du, wie man ein Objekt "als Referenz" übergibt?

    2. Du hast eine std::map<string, vector<string>> und keine std::map<string, vector<string>*>

    1. Ich habe keinen Compilerfehler dabei "mymap["d"]-> "(will mymap["d"]->push_back("bbb") machen) schon garnichts kommt und da brauch ich nicht compilieren. Allerdings bei " mymap-> " kommen schon die vorschläge. Also habe ich hier wohl irgendwie ein pointer problem bzw. hab ich hier wahrscheinlich die map mit den pointern nicht verstanden, weil das ist hier für mich ein wenig komplizierter als bei integer.

    2. wenn ich eine refernz habe, kann ich mit der referenz auf der variable ackern.. d.h.

    int var =1;
    int &ref = var;
    
    ref = 2;
    cout << var << endl; // ausgabe 2
    

    genau das mach ich ja jetzt...

    3. was ich aber will ist mit der map

    int i = 1;
    int *pi = 0;
    
    pi = &i; 
    
    cout << *pi << endl;
    
    function1(map<string,vector<string>> *mymap)
    {
    mymap["1"]->pushBack("bla");
    }
    
    void main()
    {
    map<string,vector<string>> amap;
    function1(&amap);
    
    return 0;
    }
    
    //Fehler:
    //error C2107: Ungültiger Index, Dereferenzierung nicht zulässig.
    // Links von "->pushBack" muss sich ein Zeiger auf Klassen-/Struktur-/Union-//generischen Typ befinden.
    


  • lulu32 schrieb:

    1. Ich habe keinen Compilerfehler dabei "mymap["d"]-> "(will mymap["d"]->push_back("bbb") machen) schon garnichts kommt und da brauch ich nicht compilieren. Allerdings bei " mymap-> " kommen schon die vorschläge. Also habe ich hier wohl irgendwie ein pointer problem bzw. hab ich hier wahrscheinlich die map mit den pointern nicht verstanden, weil das ist hier für mich ein wenig komplizierter als bei integer.

    ohje... erstmal solltest du dich nicht blind auf die auto completion verlassen. Soviel, wie du vermutlich zwischen Pointer und Referenz hin- und hergesprungen bist, kommt Visual Assist da auch nicht hinterher.

    Du musst einfach nur den Unterschied in der Verwendung von Pointer und Referenz lernen.

    lulu32 schrieb:

    2. wenn ich eine refernz habe, kann ich mit der referenz auf der variable ackern..

    und wie genau machst du das? Also was ist richtig:

    MyObject& ref = GetReference();
    ref.DoSomething();  // das hier?
    ref->doSomething(); // oder das hier?
    

    [edit]

    // Links von "->pushBack" muss sich ein Zeiger auf Klassen-/Struktur-/Union-//generischen Typ befinden.
    

    da steht es doch. das "Ding", was links von "->pushBack" steht, muss ein Zeiger sein. Das ist es aber bei dir nicht.

    Überleg doch mal, welchen Typ das "Ding" hat, das bei "myMap["1"]" rauskommt...



  • lulu32 schrieb:

    Und beim Programieren brauch ich persönlich immer Beispiele um es zu verstehen von dem her hab ich mir einigige beispiele angeschaut!!!!!!!

    "Jeder soll nach seiner Façon glücklich werden":

    void function1(map<string,vector<string>> *mymap)
    {
      (*mymap)["1"].push_back("bla");           // 1
      mymap->operator[]("1").push_back("bla");  // 2
    }
    


  • Furble Wurble schrieb:

    lulu32 schrieb:

    Und beim Programieren brauch ich persönlich immer Beispiele um es zu verstehen von dem her hab ich mir einigige beispiele angeschaut!!!!!!!

    "Jeder soll nach seiner Façon glücklich werden":

    void function1(map<string,vector<string>> *mymap)
    {
      (*mymap)["1"].push_back("bla");           // 1
      mymap->operator[]("1").push_back("bla");  // 2
    }
    

    Vielen Dank jetzt kann ich auch mal anfangen es zu verstehen 🙂

    Jetzt aber noch zu meiner Verteidigung was, wenn ich einen function(vector<string> *avector) dann kann ich avector->push_back() machen. Das verwirrt mich so..

    Aber dadruch mymap->operator[]("1").push_back("bla"); ist es mir jetzt klar geworden

    vielen dank 🙂



  • lulu32 schrieb:

    Jetzt aber noch zu meiner Verteidigung was, wenn ich einen function(vector<string> *avector) dann kann ich avector->push_back() machen. Das verwirrt mich so..

    Wenn du einen Pointer hast, nimmst du "->". Ansonsten ".".

    Eigentlich ganz einfach 🙂



  • lulu32 schrieb:

    asc schrieb:

    Wäre schön wenn du dir wenigstens mein Beispiel angeschaut hättest. Dann würdest du vielleicht auch verstehen...

    Ich finde es ja nett das ihr mir helfen wollt, aber damit eher nicht. Ich studiere jetzt auch schon über 2 Jahre Informatik und weiß schon wie ich vorzugehen habe, wenn ich was nicht verstehe...

    Ich habe wiederum Probleme wenn man eine Zeile Code die man geliefert bekommt nicht einmal ausprobiert, und das gleiche wie zuvor schreibt. Das hat auch nichts mit der Dauer zu tun, wie lange man sich damit auseinander setzt.

    Unabhängig davon: Warum überhaupt immer Zeiger? Warum keine Referenzen etc?

    Sind die Daten optional, dann akzeptiere ich in einem Funktionskopf Zeiger, wenn nicht will ich wenigstens die Gründe für die Zeiger wissen. Wenn du etwas als Zeiger übergibst, so kann man ohne weiteres auch einen 0-Zeiger übergeben. Und wenn man dies in der Funktion nicht abprüft (und sei es wenigstens im Debugmodus mit Mechanismen wie assert) wird man ganz schnell eine Zugriffsverletzung ernten wenn man doch mal die Funktion falsch verwendet.

    Eine Referenz kann man zwar auch ungültig machen, dies muss man aber eigentlich schon mutwillig tun. Es ist zumindest schwerer. Und Referenzen deuten eindeutig darauf das man hier ein Objekt erzwingt. Zudem erleichtert es die Schreib- und Denkweise.


Anmelden zum Antworten