Es funktioniert nicht so, wie ich es will



  • Hallo, und zwar wollte ich euch mal fragen, ob ihr mir helfen könnt.

    Ich hab eine Aufgabe bekommen, ich hab sie auch soweit gelöst (Menu + Swap), aber mein Problem ist, die Aufgabe 1 & 2.

    Und zwar ist bei mir der Fall, dass, egal welche Zahlen ich eingebe (!), immer derselbe Wert (Zeiger/Referenz) rauskommt (Bei mir im Code ist es die Funktion 2).
    Und laut der Aufgabe soll das nicht so sein, oder?

    Ich hab wirklich alles versucht,ich bin mit mein Wissen am Ende,....

    Entweder kommt nicht das raus, was ich will oder es kommt immer ein Fehler (sobald ich versuche, es so zu ändern, wie es verlangt wurde).

    Ich wäre euch sehr dankbar, wenn ihr mir helfen könntet.
    Hier die Aufgabe:

    Es soll ein Programm erstellt werden, in dem dann das
    Verhalten von Variablen und zugehörigen Zeigervariablen mittels Funktionen demonstriert
    werden soll. In dem Programm sind daher 2 Variable (z.B. a,b) eines ausgewählten Typs zu
    deklarieren und geeignet zu initialisieren, sowie 2 Zeigervariable auf diesen Typ (z.B. pa und
    pb), welche anfänglich auf die beiden Variablen verweisen.
    Dann sind folgende Funktionen zu erstellen, wobei die Variablen bzw. Zeigervariablen als
    Parameter zu übergeben sind (keine globalen Größen!!). Legen Sie jeweils die passende
    Übergabetechnik (Call by Value/Reference) fest.

    1. 2 Funktionen mit dem (gleichen) Namen inputValue zur Eingabe der Werte der beiden
      Variablen über Tastatur. Die eine Funktion hat dabei Referenzen als Parameter , die
      andere hat die beiden Zeigervariablen als Parameter.

    2. 2 Funktionen mit dem (gleichen) Namen outputValue zur Anzeige der Werte der beiden
      Variablen am Bildschirn. Die eine Funktion hat dabei die Variablen selbst als Parameter,
      die andere hat die beiden Zeigervariablen als Parameter.

    Das Programm main soll dann ein Menue enthalten, in welchem der Nutzer wiederholt eine der
    Funktionen auswählen und aufrufen bzw. das Programm beenden kann.
    Für alle Funktionen (ohne main) sind Entwurf und Testplan zu erstellen.

    Code:

    #include <iostream>
    using namespace std;
    
    void inputValue(int a, int b)
    {
    }
    
    void inputValue(int *pa, int *pb)
    {
    
    }
    
    void outputValue(int a, int b)
    {
    
    }
    
    void outputValue(int *pa, int *pb)
    {
    }
    
    void swap(int *pa, int *pb)
    {
    	int tmp;
    	tmp=*pa;
    	*pa=*pb;
    	*pb=tmp;
    }
    
    int main()
    {
    	int a,b;
    	int auswahl;
    	bool wiederholung=true;
    
    	do
    	{
    
    		cout<<"Welchen Befehl wollen sie durchfuehren"<<endl<<endl;
    		cout<<"Zahlen eingeben (1)"<<endl;
    		cout<<"Referenz ausgeben (2)"<<endl;
    		cout<<"Swap-Funktion (3)"<<endl;
    		cout<<"Programm beenden (4)"<<endl;
    		cin>>auswahl;
    
    		system("cls");
    
    		switch (auswahl)
    		{
    		case 1:
    		{
    
    			cout<<"Geben Sie Ihre Zahlen an :"<<endl;
    
    			cin>>a;
    
    			cin>>b;
    		}
    
    		break;
    
    		case 2:
    		{
    			cout<<"  A ist = "<<&a<<endl;
    			cout<<"  B ist = "<<&b<<endl;
    		}
    		break;
    
    		case 3:
    		{
    
    			inputValue(a,b);
    			swap(a,b);
    			outputValue(a,b);
    
    			cout<<"  A ist = "<<a<<endl;
    			cout<<"  B ist = "<<b<<endl;
    		}
    		break;
    
    		case 4:
    			wiederholung=false;
    			break;
    		}
    
    	} while (wiederholung ==true);
    
    	return 0;
    }
    


  • du hast in deinem menu in punkt 2 glaub ich "referenzen ausgeben". weisst du überhaupt was referenzen sind?

    das sind quasi andere namen für ein-und-dieselbe variable. deklariert wird das mit dem kaufmännischen und zeichen

    beispiel:

    int a = 5;
    int & refA = a; // a und refA 'zeigen' auf den gleichen speicherplatz, sprich sind gleich
    
    cout << a << endl; // "5"
    cout << refA << endl; // "5"
    // hier sind a und damit auch refA gleich 5
    a = 6;
    cout << a << endl; // "6"
    cout << refA << endl; // "6"
    refA = 7;
    cout << a << endl; // "7"
    cout << refA << endl; // "7"
    

    soweit verstanden?

    also wie zeiger, nur der umweg über die dereferenzierung(*ptA = 5;) fällt weg.

    und das sollst du jetzt in die funktionen einbauen:

    void inputValue(int & a, int & b) // referenzen als parameter
    {
        cin >> a >> b;
    }
    
    void inputValue(int * pa, int * pb) // zeigerals parameter
    {
        cin >> *pa >> *pb;
    }
    
    void outputValue(int const& a, int const& b)
    {
        cout << a << ", " << b << endl;
    }
    
    void outputValue(int const *const pa, int const * const pb)
    {
        cout << pa << ", " << pb << endl;
    }
    
    int main()
    {
        int a = 5;
        int b = 6;
        // ...
    
        inputValue(a, b); // referenz !!
        // ...
        inputValue(&a, &b); // per zeiger !
    
        // ...
    }
    


  • 😮 Das sind ja viele const 🙂

    void outputValue(int const *const pa, int const * const pb)
    {
        cout << pa << ", " << pb << endl;
    }
    

    Ist alles korrekt, aber macht es auch Sinn? Das jeweils erste const bezieht sich auf den Wert, auf den der Pointer zeigt. Es macht Sinn diesen als const zu deklarieren. Der Aufrufer weiss dann, dass die Funktion den Wert nicht verändert.

    Das jeweils 2te const bezieht sich auf den Pointer selbst. Welchen Sinn macht es diesen als const zu deklarieren?

    Gibt es eigentlich einen Unterschied zwischen den folgenden Funktionen?

    void outputValue(const int *pa)
    {
        cout << pa << endl;
    }
    
    void outputValue(int const *pa)
    {
        cout << pa << endl;
    }
    

    Ich nehme immer die erste Variante und sie tut was man erwartet...



  • http://www.c-plusplus.net/forum/282397

    Der Post von Seldon:

    char const *params ist das selbe wie const char *params - eine Zeigervariable auf char-Konstante.
    const char const *params ist ein Fehler; zweimal const auf char geht nicht.
    char *const params ist eine Zeigerkonstante auf char-Variable.

    char const *const params ist eine Zeigerkonstante auf char-Konstante.
    char const *const *const params ...und so weiter halt.

    Ob es in dem Zusammenhang das gleiche ist, weiß ich nicht genau, denke aber schon..?!

    http://devmaster.net/forums/topic/2888-difference-between-const-int-i-and-int-const-i/



  • 'S hilft da von Rechts nach Links zu lesen

    IDENTIFIER///Bezeichner von..
    const  ///Konstantem
    *      ///Zeiger (auf)
    const  ///Konstantes
    char   ///Objekt
    
    char const * const IDENTIFIER;
    


  • genau, das mit dem von rechts nach links ist gold wert.

    aber es geht hier ja nicht um const sondern eigentlich um die aufgabe. dazu hat sich der TE ja noch überhaupt nicht mehr geäussert

    das const kann man machen, muss man nicht und dass ichs was übertrieben hab war zu meinem persönlichen spass 🙂



  • Habe es hinbekommen, war bei einem guten Kollegen, der gut c++ programmieren kann.
    Er hat es mir auch richtig gut erklärt und ich habe alles verstanden.
    @SkyM0sh0: Dein Code war richtig, genauso musste ich das machen.
    Danke für die Antwort 🙂

    Auch an alle anderen Danke, die mir helfen wollten 🙂


Anmelden zum Antworten