Problem mit zeigern!



  • Hier mal ein code update mit func4:

    #include<iostream>
    using namespace std;
    /*Zeiger test*/
    void func1(int, int);
    int* func2(int*, int*);
    void func3(int&, int&);
    int* func4();
    
    int main()
    {
    	int zahl;
    	int zahl2;
    	int* pzahl;
    	int* pzahl2;
    	pzahl=&zahl;
    	pzahl2=&zahl2;
    
    	cout<<"Geben sie 2 zahlen ein"<<endl;
    	cin>>zahl;
    	cin>>zahl2;
    
    	cout<<"Geben sie nun die zeiger art ein die sie haben wohlen"<<endl
    		<<"Hier die Uebersicht(1=Werteuebergabe, 2=Zeigerwerteuebergabe, "<<endl
    		<<"3=Uebergabe per Reference, 4=heapspeicher nutzung"<<endl;
    
    	int choice;
    	cin>>choice;
    
    	switch(choice)
    	{
    	case 1:
    		func1(zahl, zahl2);
    			cout<<zahl<<endl
    				<<zahl2<<endl;
    		break;
    	case 2:
    		func2(pzahl, pzahl2);
    		cout<<zahl<<endl
    			<<zahl2<<endl;
    			break;
    	case 3:
    		func3(zahl, zahl2);
    		cout<<zahl<<endl
    			<<zahl2<<endl;
    			break;
    	case 4:
    		int* pzahl2;
    		pzahl2=func4();
    		delete pzahl2;
    		cout<<zahl<<endl
    			<<zahl2<<endl;
    		break;
    	default:
    		cout<<"Eingabe Ungueltig"<<endl;
    			break;
    	}
    	system("PAUSE");
    }
    
    void func1(int number, int number2)
    {
    	number=100;
    	number2=200;
    	cout<<number<<endl
    		<<number2<<endl;
    }
    
    int* func2(int* pnumber, int* pnumber2)
    {
    	*pnumber=110;
    	*pnumber2=220;
    	return pnumber, pnumber2;
    }
    
    void func3(int& number, int& number2)
    {
    	number=130;
    	number2=240;
    	cout<<number<<endl
    		<<number2<<endl;
    }
    
    int* func4()
    {
    	int* pnumber=new int;
    	*pnumber=10;
    	cout<<*pnumber<<endl;
    	return pnumber;
    }
    

    Wenn noch fehler drin sind bitte melden 🙂



  • Deine func2() soll immer noch 2 Werte zurückgeben, das geht nicht und wird auch in Zukunft mit C++ nicht gehen. Eine Funktion gibt immer nur maximal!!!! 1 Element ihres Rückgabetyps zurück. Natürlich ist es sinnlos einen Rückgabetyp (ungleich void) zu vereinbaren und dann nicht zu nutzen. Auch wenn der Compiler solche Konstrukte mit dem Komma-Operator vielleicht zulässt wird die Funktion so wie sie dort steht nicht das zurückgeben was du von ihr eigentlich zurückgeben lassen willst.



  • Danke für die info 🙂 hab ich wieder mal gepennt 🙂 bin ja noch am anfang und lehrne ja noch welche sachen man meiden muss 🙂



  • Mal ne dumme Frage: Was macht der Komma Operator?
    Ich weiß das man nur ein Wert zurückgeben kann, aber mir ist bis jetzt schleihaft warum sich so ein Qwatsch kompelieren lässt.



  • Wie pumuckl schon sagte:

    pumuckl schrieb:

    Es enthält den Komma-Operator, der von links nach rechts ausgewertet wird, bevor das Ergebnis der return-Anweisung übergeben wird.
    ...
    Fazit: die returnanweisung gibt nur den Wert von pnumber2 zurück, das pnumber davor hat keinerlei Auswirkungen und wird vermutlich vom Compiler wegoptimiert.



  • lol



  • Okay versuch nummer 103 🙂 :

    #include<iostream>
    using namespace std;
    /*Zeiger test*/
    void func1(int, int);
    void func2(int*, int*);
    void func3(int&, int&);
    int* func4();
    
    int main()
    {
    	int zahl;
    	int zahl2;
    	int* pzahl;
    	int* pzahl2;
    	pzahl=&zahl;
    	pzahl2=&zahl2;
    
    	cout<<"Geben sie 2 zahlen ein"<<endl;
    	cin>>zahl;
    	cin>>zahl2;
    
    	cout<<"Geben sie nun die zeiger art ein die sie haben wohlen"<<endl
    		<<"Hier die Uebersicht(1=Werteuebergabe, 2=Zeigerwerteuebergabe, "<<endl
    		<<"3=Uebergabe per Reference, 4=heapspeicher nutzung"<<endl;
    
    	int choice;
    	cin>>choice;
    
    	switch(choice)
    	{
    	case 1:
    		func1(zahl, zahl2);
    			cout<<zahl<<endl
    				<<zahl2<<endl;
    		break;
    	case 2:
    		func2(pzahl, pzahl2);
    		cout<<zahl<<endl
    			<<zahl2<<endl;
    			break;
    	case 3:
    		func3(zahl, zahl2);
    		cout<<zahl<<endl
    			<<zahl2<<endl;
    			break;
    	case 4:
    		int* pzahl2;//deklaration des zeigers auf int zahl2
    		pzahl2=func4();//zeiger an func 4 übergeben
    		delete pzahl2;//speicher löschen
    		cout<<zahl<<endl
    			<<zahl2<<endl;
    		break;
    	default:
    		cout<<"Eingabe Ungueltig"<<endl;
    			break;
    	}
    	system("PAUSE");
    }
    
    void func1(int number, int number2)
    {
    	number=100;
    	number2=200;
    	cout<<number<<endl
    		<<number2<<endl;
    }
    
    void func2(int* pnumber, int* pnumber2)
    {
    	*pnumber=110;
    	*pnumber2=220;
    }
    
    void func3(int& number, int& number2)
    {
    	number=130;
    	number2=240;
    	cout<<number<<endl
    		<<number2<<endl;
    }
    
    int* func4()
    {
    	int* pnumber=new int;//speicherplatz holen
    	*pnumber=10;//speicher wert zuweisen
    	cout<<*pnumber<<endl;//wert ausgeben
    	return pnumber;//zeiger zurückgeben 
    }
    


  • Er hats endlich kapiert 😃
    Nix für ungut, aber zusehen, dass endlich kein return nummer1, mummer2 in deinem Code steht ist echt schön.



  • Jo trotz meines Realschulabschlusses(@WIP) stand ich ne weile auf der leitung 🙂
    Ferien halt 😛



  • MartinMilbret schrieb:

    trotz meines Realschulabschlusses(@WIP) stand ich ne weile auf der leitung 🙂

    lol?



  • hätte ich anders schreiben sollen. Korektur:
    Trotz meines vorhabens einen erweiterten Realschulabschluss zu erreichen stand ich dur die ferien extrem auf der leitung 😛

    EDIT: Hier mal das programm mit header datei(mit header daten bin ich noch am anfang :P):
    header:

    int zahl;
    int zahl2;
    int* pzahl;
    int* pzahl2;
    int choice;
    
    void func1(int, int);
    void func2(int*, int*);
    void func3(int&, int&);
    int* func4();
    

    cpp datei:

    #include<iostream>
    #include"Crap.h"
    using namespace std;
    /*Zeiger test*/
    
    int main()
    {
    	pzahl=&zahl;
    	pzahl2=&zahl2;
    	cout<<"Geben sie 2 zahlen ein"<<endl;
    	cin>>zahl;
    	cin>>zahl2;
    
    	cout<<"Geben sie nun die zeiger art ein die sie haben wohlen"<<endl
    		<<"Hier die Uebersicht(1=Werteuebergabe, 2=Zeigerwerteuebergabe, "<<endl
    		<<"3=Uebergabe per Reference, 4=heapspeicher nutzung"<<endl;
    	cin>>choice;
    
    	switch(choice)
    	{
    	case 1:
    		func1(zahl, zahl2);
    			cout<<zahl<<endl
    				<<zahl2<<endl;
    		break;
    	case 2:
    		func2(pzahl, pzahl2);
    		cout<<zahl<<endl
    			<<zahl2<<endl;
    			break;
    	case 3:
    		func3(zahl, zahl2);
    		cout<<zahl<<endl
    			<<zahl2<<endl;
    			break;
    	case 4:
    		int* pzahl2;//deklaration des zeigers auf int zahl2
    		pzahl2=func4();//zeiger an func 4 übergeben
    		delete pzahl2;//speicher löschen
    		cout<<zahl<<endl
    			<<zahl2<<endl;
    		break;
    	default:
    		cout<<"Eingabe Ungueltig"<<endl;
    			break;
    	}
    	system("PAUSE");
    }
    
    void func1(int number, int number2)
    {
    	number=100;
    	number2=200;
    	cout<<number<<endl
    		<<number2<<endl;
    }
    
    void func2(int* pnumber, int* pnumber2)
    {
    	*pnumber=110;
    	*pnumber2=220;
    }
    
    void func3(int& number, int& number2)
    {
    	number=130;
    	number2=240;
    	cout<<number<<endl
    		<<number2<<endl;
    }
    
    int* func4()
    {
    	int* pnumber=new int;//speicherplatz holen
    	*pnumber=10;//speicher wert zuweisen
    	cout<<*pnumber<<endl;//wert ausgeben
    	return pnumber;//zeiger zurückgeben 
    }
    

    Falls noch mehr in die header kann bitte antworten 🙂



  • Okay nochmal ein anderes zeiger problem:

    #include<iostream>
    using namespace std;
    char* wahl(int);
    
    int main()
    {
    	int months;
    	cout<<"Welchen monat wollen sie haben(1-12)\n";
    	cin>>months;
    	wahl(months);
            cout<<months<<"\n";
    	system("PAUSE");
    }
    
    char* wahl(int monat)
    {
    	if(monat<1||monat>12)
    	{
    		return "ungültig";
    	}
    	char* pszmonate[]={"ungültig", "Januar", "Februar", "Maerz", 
    						"April", "Mai", "Juni", "Juli",
    						"August", "September", "Oktober", 
    						"November", "Dezember"}; 
    	cout<<monat<<"\n";
    	return pszmonate[monat];
    }
    

    Das Programm ansich läuft aber er soll ja die namen der monate zurückgeben und dann ausgeben aber er gibt nur die zahl die eingegeben wurde aus 😢



  • Dann mußt du auch den Rückgabewert von wahl() weiterverarbeiten (in der Funktion gibst du wirklich nur die Zahl aus und schickst den Monatsnamen per return an's Hauptprogramm - nur das vergisst diesen Wert sofort wieder).

    btw, ich weiß nicht, ob der Wert noch gültig ist, wenn du aus der Funktion rauskommst - kann genausogut sein, daß sich inzwischen der Stack aufgräumt hat und der zurückgegebene Pointer auf einen Haufen Datenmüll zeigt.



  • also sollte ich die ausgabe wohl mal auf die funktion eingrenzen oder?
    aber wenn ich das mache gibt er auch nur die zahl aus 😞



  • cout<<pszmonate[monat];
    

    ?



  • @shapless
    THX Hat funktioniert 😉

    hier der code:

    #include <iostream>
    using namespace std;
    void wahl(int);
    
    int main()
    {
    	int months;
    	cout<<"Welchen monat wollen sie haben(1-12)\n";
    	cin>>months;
    	wahl(months);
    	system("PAUSE");
    }
    
    void wahl(int monat)
    {
    	if(monat<1||monat>12)
    	{
    		cout<<"ungueltig\n";
    	}
    	else
    	{
    	char* pszString[]={"ungueltig", "Januar", "Februar", "Maerz", 
    						"April", "Mai", "Juni", "Juli",
    						"August", "September", "Oktober", 
    						"November", "Dezember"}; 
    	cout<<pszString[monat]<<"\n";
    	}
    }
    

Anmelden zum Antworten