Einfach Übung, viele große Fehler!



  • So, jetzt hab ich hier noch ein kleines Verständnisproblem

    In der Schule sollen wir das ganze ja ohne globale variablen lösen.

    Zb. bekomm ich die Aufgabe die Eingabe und die Ausgabe je in eine Funktion zu bekommen. Da ich aber die Pointer nicht verstanden habe, weiß ich auch nicht wie ich Array(10) in eine neue Funktion (zb. Funktion 2) bekommen würde.

    Könnt ihr mir da noch ein wenig helfen? Denn das ist meine Hauptfehlerquelle, ich arbeite immer mit gloabel Variablen was ja auch nicht gut ist!

    Gibt es da irgendeine Methode die man da gut verwenden könnte? Oder hat sogar vector eine spezielle Funktion dafür?

    LG



  • Etwa so:

    void Eingabe(vector<int>* ZeigerAufVektor)
    {
      //Einlesen
    }
    void Ausgabe(const vector<int>* ZeigerAufVektor) //const wegen const-correctness
    {
      //Ausgeben
    }
    int main()
    {
      vector<int> MeinVektor(10);
      Eingabe(&MeinVektor);
      Ausgabe(&MeinVektor);
    }
    

    Ich würde euch erst Referenzen statt Zeiger beibringen. Was für ein Prof...



  • Dann zeigs ihm doch richtig mit Referenzen und nicht mit Zeigern 😉

    vector<int> Eingabe()
    {
      //Einlesen
    }
    void Ausgabe(const vector<int>& ReferenzAufVektor) //const wegen const-correctness
    {
      //Ausgeben
    }
    int main()
    {
      vector<int> MeinVektor = Eingabe();
      Ausgabe(MeinVektor);
    }
    


  • pumuckl schrieb:

    Ausgabe(&MeinVektor);
    

    😕



  • Huhu, aber kann das denn so funktionieren? Ich habe doch oben die Funktionen. Da C+ aber von oben nach unten arbeitet, kennt er doch oben mein Array() noch garnicht wenn ich es unten erst deklariere, oder?

    Sorry wenn ich soviel frage, ist echt nicht so einfach wenn einem die Person nicht gegenüber sitzt ..... ^^

    So siehts grad aus, aber sollte ich oben den "ZeigerAufVector nicht auch umbenennen?

    void Funktion1(vector<int>* ZeigerAufVector)
    {
    	for (size_t i=0;i<Array.size();i++)
    	{
    		cout << "Bitte geben sie den Wert fuer dieses Array an: " << endl;
    			cin >> Array.at(i) ;
    			system("cls");
    	}
    }
    
    void Funktion2(const vector<int>* ZeigerAufVektor)
    {
    		for (size_t i=0;i<Array.size();i++)
    	{
    		cout << Array.at(i) << endl;
    	}
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	vector<int> Array(10);
    	Funktion1(&Array);
    	Funktion2(&Array);
    	system("pause");
    	return 0;
    }
    

    LG



  • Limatex schrieb:

    Huhu, aber kann das denn so funktionieren?

    Wenn ich nichts übersehen habe, ja.

    Limatex schrieb:

    Da C+ aber von oben nach unten arbeitet, kennt er doch oben mein Array() noch garnicht wenn ich es unten erst deklariere, oder?

    Ein Beispiel:

    void Funktion(int Integer)
    {
      cout << Integer; //Integer bezieht sich auf das Objekt, das als Parameter gegeben wurde
    }
    int main()
    {
      int a = 4;
      Funktion(a); //"a" ist in der Funktion das selbe wie "Integer"
    }
    

    Limatex schrieb:

    Sorry wenn ich soviel frage, ist echt nicht so einfach wenn einem die Person nicht gegenüber sitzt ..... ^^

    Dafür sind wir da.



  • EOutOfResources schrieb:

    pumuckl schrieb:

    Ausgabe(&MeinVektor);
    

    😕

    sry habs korrigiert



  • Die beiden Arrays (Da bei array.size) werden mir aber in beiden Funktionen jeweils noch als nicht definiert gemakert.

    Array.at ist aber nicht rot.



  • Aha, jetzt seh' ich es. Statt Array schreibst du einfach *ZeigerAufVector (innerhalb der Funktionen).



  • ...und ggf auch mit Klammern drumherum, also (*ZeigerAufVector) , da das Sternchen als Präfixoperator weniger stark bindet als [] oder .at .



  • Ach scheiße ich bin echt durcheinander 😃

    Welches "Array" meinst du nun? Irgendwie hab ich mich grad verheddert....^^



  • Limatex schrieb:

    Welches "Array" meinst du nun?

    Ersetzt jedes " Array " in beiden Funktionen durch " (*ZeigerAufVektor) ".



  • Okay, vielen Dank! Hat funktioniert!! 🙂

    Und was bedeutet das hier in den Klammern? Ist das der "Wert" der dem Zeiger zugewiesen wird oder wie?

    Funktion1(&Array);
    	Funktion2(&Array);
    


  • Limatex schrieb:

    Ist das der "Wert" der dem Zeiger zugewiesen wird oder wie?

    Ja, ist es. Im Buch deiner Wahl sollte im Zusammenhang mit Zeigern auch der Adressoperator erwähnt werden.



  • Bin ja grad dabei den Code zu optimieren und noch ein paar zusätzliche Funktionen einzubauen. Nun wollte ich die Ausgabe sortieren, doch beide Klammern vor den letzten beiden vorderen Zeigern werden rot gemarkert mit der Begründung "Der Ausdruck muss ein Änderbarer Ivalue sein!

    Nachdem ich die beiden = durch == ersetzt habe waren die Klammer zwar weg, aber beim ausführen kam ein neues Fenster:

    void Sortieren(const vector<int>*Zeiger) 
     { 
    	 int hilf;
         for(size_t i2=0;i2<(*Zeiger).size();i2++) 
         { 
             for(size_t i=0;i<(*Zeiger).size();i++)
             { 
                 if((*Zeiger).at(i+1)>(*Zeiger).at(i)) 
                 { 
                     hilf=(*Zeiger).at(i); 
                     (*Zeiger).at(i)==(*Zeiger).at(i+1); 
                     (*Zeiger).at(i+1)==hilf; 
                 } 
             } 
         } 
     }
    

    http://img232.imageshack.us/img232/8312/capturemk.jpg

    LG

    EDIT: bzw. kommt jetzt wo ich die normalen[] Arrays zu .at() gemacht habe eine andere reihe von fenster welche aber auch etwas von out of range erzählt!



    1. statt (*Zeiger).bla kannst du auch Zeiger->bla schreiben. Lies dir wirklich mal das Kapitel über Zeiger im C++-Buch deiner Wahl durch.

    2. Die Meldung "Ausdruck muss ein änderbarer lvalue sein" bezieht sich vor allem auf das änderbar. Du hast den Zeiger in der Argumentliste so deklariert, dass es ein Zeiger auf const ist, d.h. dass der vector, auf den der Zeiger zeigt, nicht verändert werden darf. Die Zuweisung auf das Element ändert aber den vector, das widerspricht sich also.

    3. Nehmen wir an, size() sei 10. Überleg mal, was in der inneren Schleife passiert, wenn i 9 ist, vor allem was beim zweiten at()-Aufruf übergeben wird. Dann weißt du auch woher die Fehlermeldung kommt.

    4. == und = sind zwei völlig unterschiedliche paar Schuhe, ich hoffe du weißt das.


Anmelden zum Antworten