C++ Zeiger als Parameter an Funktion übergeben

meph!sto

Vice Admiral
Registriert
Nov. 2003
Beiträge
6.289
Hi,
wir haben hier eine Aufgabe und ich komme einfach nicht weiter.
Die Aufgabenstellung lautet wie folgt:

1) Eine Funktion mit Namen input, welche von Tastatur Werte für die Variablen liest und
sie diesen zuweist.
2) 2 Funktionen mit Namen outputValue, wobei die eine die Werte der beiden Variablen, die
andere die Werte der beiden Zeigervariablen am Bildschirm anzeigt.
3) 2 Funktionen mit Namen outputAdress, wobei die eine die Adresse der beiden Variablen,
die andere die Adresse der beiden Zeigervariablen am Bildschirm anzeigt.
4) 2 Funktionen mit Namen swap, welche die Werte der Variablen bzw. Zeigervariablen
vertauschen.

Dazu habe ich auch schon einen Code geschrieben, der irgendwie nicht so ganz will.
Lässt sich nicht mal kompilieren -.-'

Code:
#include <iostream>
using namespace std;

void input (double &a, double &b);
void outputvalue_vars (double a, double b);
void outputvalue_ptr (double *ptr_a, double *ptr_b);
void outputadress_vars (double a, double b);
void outputadress_ptr (double ptr_a, double ptr_b);
void swap_vars (double *a, double *b);
void swap_ptr (double &ptr_a, double &ptr_b);
void main()
{
	int auswahl;
	double a, b;
	double *ptr_a=&a, *ptr_b=&b;
	do
	{
		cout<<">>>> Zahlen einlesen: 1 <<<<\n";
		cout<<">>>> Zahlen ausgeben: 2 <<<<\n";
		cout<<">>>> Zeiger ausgeben: 3 <<<<\n";
		cout<<">>>> Speicheradressen der Zahlen ausgeben: 4 <<<<\n";
		cout<<">>>> Speicheradressen der Zeiger ausgeben: 5 <<<<\n";
		cout<<">>>> Werte tauschen: 6 <<<<\n";
		cout<<">>>> Zeiger tauschen: 7 <<<<\n";
		cout<<">>>> Beenden: 8 <<<<\n\n";
		cin>>auswahl;
		cout<<""<<endl;
		switch(auswahl)
		{
		case 1:
			input(a,b);
		break;
		case 2:
			outputvalue_vars(a,b);
		break;
		case 3:
			outputvalue_ptr(&a,&b);
		break;
		case 4:
			outputadress_vars(a,b);
		break;
		case 5:
			outputadress_ptr(ptr_a,ptr_b);
		break;
		case 6:
			swap_vars(&a,&b);
		break;
		case 7:
			swap_ptr(&ptr_a,&ptr_b);
		break;
		}
	}while(auswahl != 8);

}

void input (double &a, double &b)
{
	cout<<"Wert #1 eingeben: ";
	cin>>a;
	cout<<"Wert #2 eingeben: ";
	cin>>b;
	cout<<""<<endl;
}

void outputvalue_vars (double a, double b)
{
	cout<<"Wert #1: "<<a<<endl;
	cout<<"Wert #2: "<<b<<endl;
	cout<<""<<endl;
}

void outputvalue_ptr (double *ptr_a, double *ptr_b)
{
	cout<<"Zeiger auf Wert #1: "<<ptr_a<<endl;
	cout<<"Zeiger auf Wert #2: "<<ptr_b<<endl;
	cout<<""<<endl;
}

void outputadress_vars (double a, double b)
{
	cout<<"Adresse #1: "<<&a<<endl;
	cout<<"Adresse #2: "<<&b<<endl;
	cout<<""<<endl;
}

void outputadress_ptr (double ptr_a, double ptr_b)
{
	cout<<"Adresse des Zeigers #1: "<<&ptr_a<<endl;
	cout<<"Adresse des Zeigers #2: "<<&ptr_b<<endl;
	cout<<""<<endl;
}

void swap_vars (double &a, double &b)
{
	double temp=a;
	a=b;
	b=temp;
}

void swap_ptr (double **ptr_a, double **ptr_b)
{
	double *temp=*ptr_a;
	*ptr_a=*ptr_b;
	*ptr_b=temp;
}

Wäre cool wenn mir jemand hier weiterhelfen könnte.
danke !
 
1. wenn er nichtmal kompilliert, gibts doch sicher eine fehlermeldung ... wo ist die?!?

2. im titel beschreibst du nur ein minimales problem, vllt solltest du auch nur die betreffenden zeilen posten, sonst wirds unübersichtlich -> und keiner (kaum jemand) hat lust, alles durchzulesen ohne highlighting etc.
 
Ok, hast ja Recht ;)

laut Visual Studio Express 2008 sind 2 Fehler vorhanden.

1)
Code:
case 5:
        outputadress_ptr(ptr_a,ptr_b);
break;
mit der Fehlermeldung:
error C2664: 'outputadress_ptr': Konvertierung des Parameters 1 von 'double *' in 'double' nicht möglich

2)

Code:
case 7:
	swap_ptr(&ptr_a,&ptr_b);
break;
mit der Fehlermeldung:
error C2664: 'swap_ptr': Konvertierung des Parameters 1 von 'double **' in 'double &' nicht möglich

Die betroffenen Funktionen sehen so aus:
Code:
void outputadress_ptr (double ptr_a, double ptr_b)
{
	cout<<"Adresse des Zeigers #1: "<<&ptr_a<<endl;
	cout<<"Adresse des Zeigers #2: "<<&ptr_b<<endl;
	cout<<""<<endl;
}
Code:
void swap_ptr (double **ptr_a, double **ptr_b)
{
	double *temp=*ptr_a;
	*ptr_a=*ptr_b;
	*ptr_b=temp;
}
Eingebunden sind die Funktionen mit folgendem Aufruf:
Code:
void outputadress_ptr (double ptr_a, double ptr_b);
void swap_ptr (double &ptr_a, double &ptr_b);
evlt hilft das weiter
 
Code:
void swap_ptr (double &ptr_a, double &ptr_b);

Code:
void swap_ptr (double **ptr_a, double **ptr_b)
{
}

Der Prototyp und die eigentliche Implementierung stimmt nicht überein.

Code:
void outputadress_vars (double a, double b);
Code:
void outputadress_ptr (double ptr_a, double ptr_b);
Die beiden Funktionen sind leider nach deiner Aufgabenstellung falsch. Du übergibst an beide Funktionen die Werte "per Value", d.h. der Inhalt von deiner Variablen a in der "main"-Funktion wird in die Variable "a" bzw. "ptr_a" der entsprechenden Funktion kopiert. Da du dann nur mit einer Kopie arbeitest, hat diese natürlich eine andere Speicheradresse wie deine Original-Variable.

Du müsstest die Funktionen ungefähr so definieren:
Code:
void outputadress_vars (double *a, double *b);
Code:
void outputadress_ptr (double **ptr_a, double **ptr_b);

Der Aufruf würde dann ungefähr so aussehen:
Code:
outputadress_vars(ptr_a,ptr_b);
outputadress_ptr(&ptr_a,&ptr_b);
 
Zuletzt bearbeitet:
Ich habe das eben mal versucht und schon beim komplierien treten Fehler auf
error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""void __cdecl outputadress_vars(double *,double *)" (?outputadress_vars@@YAXPAN0@Z)" in Funktion "_main".

P.S: ich habe 0 Ahnung von C++ und Programmieren generell (muss das zum Glück nur 1 Semester lang belegen o.O)
 
meph!sto schrieb:
P.S: ich habe 0 Ahnung von C++ und Programmieren generell
Das merkt man auch - denn die jetzige Fehlermeldung tritt nicht beim Kompilieren sondern beim Linken auf ;)

Achte noch einmal darauf, ob der Prototyp und die Implementierung gleich sind - am besten die Zeile aus der Implementierung kopieren und nur einen Strickpunkt hinten anfügen. Wenn es dann nicht geht, dann wäre der ganze Quellcode noch einmal hilfreich.
 
Ok,
da hat tatsächlich ein "*" gefehlt.
Nun spuckt er mir aber für die Speicheradressen der Zeiger und der Variablen das gleiche aus.
Das soll doch gar nicht sein -.-'

Und wenn ich nun meine swap Funktionen mit einbinde, dann meckert er mir diese Zeile an:

case 7:
swap_ptr(&ptr_a,&ptr_b);
break;

mit dieser Fehlermeldung:

error C2664: 'swap_ptr': Konvertierung des Parameters 1 von 'double **' in 'double &' nicht möglich

Zudem ist auch scheinbar meine komplette swap_ptr verkehrt. Dort meckert er mit "Ungültige Dereferenzierung."

Aber hier mal mein kompletter Code:
Code:
#include <iostream>
using namespace std;

void input (double &a, double &b);
void outputvalue_vars (double a, double b);
void outputvalue_ptr (double *ptr_a, double *ptr_b);
void outputadress_vars (double *a, double *b);
void outputadress_ptr (double **ptr_a, double **ptr_b);
//void swap_vars (double *a, double *b);
void swap_ptr (double &ptr_a, double &ptr_b);
void main()
{
	int auswahl;
	double a, b;
	double *ptr_a=&a, *ptr_b=&b;
	do
	{
		cout<<">>>> Zahlen einlesen: 1 <<<<\n";
		cout<<">>>> Zahlen ausgeben: 2 <<<<\n";
		cout<<">>>> Zeiger ausgeben: 3 <<<<\n";
		cout<<">>>> Speicheradressen der Zahlen ausgeben: 4 <<<<\n";
		cout<<">>>> Speicheradressen der Zeiger ausgeben: 5 <<<<\n";
		cout<<">>>> Werte tauschen: 6 <<<<\n";
		cout<<">>>> Zeiger tauschen: 7 <<<<\n";
		cout<<">>>> Beenden: 8 <<<<\n\n";
		cin>>auswahl;
		cout<<""<<endl;
		switch(auswahl)
		{
		case 1:
			input(a,b);
		break;
		case 2:
			outputvalue_vars(a,b);
		break;
		case 3:
			outputvalue_ptr(&a,&b);
		break;
		case 4:
			outputadress_vars(ptr_a,ptr_b);
		break;
		case 5:
			outputadress_ptr(&ptr_a,&ptr_b);
		break;
		case 6:
			//swap_vars(&a,&b);
		break;
		case 7:
			//swap_ptr(&ptr_a,&ptr_b);
		break;
		}
	}while(auswahl != 8);

}

void input (double &a, double &b)
{
	cout<<"Wert #1 eingeben: ";
	cin>>a;
	cout<<"Wert #2 eingeben: ";
	cin>>b;
	cout<<""<<endl;
}

void outputvalue_vars (double a, double b)
{
	cout<<"Wert #1: "<<a<<endl;
	cout<<"Wert #2: "<<b<<endl;
	cout<<""<<endl;
}

void outputvalue_ptr (double *ptr_a, double *ptr_b)
{
	cout<<"Zeiger auf Wert #1: "<<ptr_a<<endl;
	cout<<"Zeiger auf Wert #2: "<<ptr_b<<endl;
	cout<<""<<endl;
}

void outputadress_vars (double *a, double *b)
{
	cout<<"Adresse #1: "<<&a<<endl;
	cout<<"Adresse #2: "<<&b<<endl;
	cout<<""<<endl;
}

void outputadress_ptr (double **ptr_a, double **ptr_b)
{
	cout<<"Adresse des Zeigers #1: "<<&ptr_a<<endl;
	cout<<"Adresse des Zeigers #2: "<<&ptr_b<<endl;
	cout<<""<<endl;
}

//void swap_vars (double &a, double &b)
//{
//	double temp=a;
//	a=b;
//	b=temp;
//}

//void swap_ptr (double &ptr_a, double &ptr_b)
//{
//	double *temp=*ptr_a;
//	*ptr_a=*ptr_b;
//	*ptr_b=temp;
//}

Danke !
 
Zuletzt bearbeitet:
Der Aufruf
swap_ptr(&ptr_a,&ptr_b);
stimmt schon aber die Funktion muss dann heißen:
void swap_ptr (double **ptr_a, double **ptr_b){
und der Protoyp oben muss natürlich dann auch dementsprechend angepasst werden. ptr_a ist ja vom typ double * (Pointer auf double) und wenn du mit & die Speicheradresse übergibst, dann wirds eben double ** (Pointer auf den Pointer einer double).

Da du bislang die übergebenen Variablen in swap_ptr nicht als Pointer übergeben hast, kannst du sie logischerweise auch nicht dereferenzieren. Wenn dus korrekt definierst, sollte der Fehler dort automatisch verschwinden!

Des weiteren solltest dus denke ich so machen:
outputvalue_ptr(ptr_a,ptr_b);
...
outputadress_vars(&a,&b); // alternativ kann man auch ptr_a und ptr_b übergeben aber eigtl. passt dies besser zur Aufgabenstellung
...
void outputvalue_ptr (double *ptr_a, double *ptr_b)
{
cout<<"Zeiger auf Wert #1: "<<ptr_a<<endl;
cout<<"Zeiger auf Wert #2: "<<ptr_b<<endl;
cout<<""<<endl;
}

...

void outputadress_ptr (double **ptr_a, double **ptr_b)
{
cout<<"Adresse des Zeigers #1: "<<ptr_a<<endl;
cout<<"Adresse des Zeigers #2: "<<ptr_b<<endl;
cout<<""<<endl;
}
 
Zuletzt bearbeitet:
Code:
void outputadress_vars (double *a, double *b)
{
	cout<<"Adresse #1: "<<[B]&[/B]a<<endl;
	cout<<"Adresse #2: "<<[B]&[/B]b<<endl;
	cout<<""<<endl;
}

Code:
void outputadress_ptr (double **ptr_a, double **ptr_b)
{
	cout<<"Adresse des Zeigers #1: "<<[B]&[/B]ptr_a<<endl;
	cout<<"Adresse des Zeigers #2: "<<[B]&[/B]ptr_b<<endl;
	cout<<""<<endl;
}
Du bekommst ja schon die Zeiger an die Funktion übergeben, daher brauchst du keinen Adressoperator mehr - einfacher ausgedrückt, die & müssen weg.

Bei der swap_ptr Funktion hast du jetzt genau die falsche Zeile über die richtige kopiert, sowohl der Prototyp als auch die Implementierung muss so lauten:
Code:
void swap_ptr (double **ptr_a, double **ptr_b)
 
Ahhh, ok. Danke !
Aber nun funktioniert diese Sch****e immer noch nicht.
Wieder ein Link-Fehler (?).
error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""void __cdecl swap_vars(double *,double *)" (?swap_vars@@YAXPAN0@Z)" in Funktion "_main".

Ich blick da langsam nicht mehr so ganz durch -.-
Bin ja schon stolz auf mich dass meine While-Schleife funktioniert wie sie soll xD

Code:
#include <iostream>
using namespace std;

void input (double &a, double &b);
void outputvalue_vars (double a, double b);
void outputvalue_ptr (double *ptr_a, double *ptr_b);
void outputadress_vars (double *a, double *b);
void outputadress_ptr (double **ptr_a, double **ptr_b);
void swap_vars (double *a, double *b);
void swap_ptr (double **ptr_a, double **ptr_b);
void main()
{
	int auswahl;
	double a, b;
	double *ptr_a=&a, *ptr_b=&b;
	do
	{
		cout<<">>>> Zahlen einlesen: 1 <<<<\n";
		cout<<">>>> Zahlen ausgeben: 2 <<<<\n";
		cout<<">>>> Zeiger ausgeben: 3 <<<<\n";
		cout<<">>>> Speicheradressen der Zahlen ausgeben: 4 <<<<\n";
		cout<<">>>> Speicheradressen der Zeiger ausgeben: 5 <<<<\n";
		cout<<">>>> Werte tauschen: 6 <<<<\n";
		cout<<">>>> Zeiger tauschen: 7 <<<<\n";
		cout<<">>>> Beenden: 8 <<<<\n\n";
		cin>>auswahl;
		cout<<""<<endl;
		switch(auswahl)
		{
		case 1:
			input(a,b);
		break;
		case 2:
			outputvalue_vars(a,b);
		break;
		case 3:
			outputvalue_ptr(&a,&b);
		break;
		case 4:
			outputadress_vars(ptr_a,ptr_b);
		break;
		case 5:
			outputadress_ptr(&ptr_a,&ptr_b);
		break;
		case 6:
			swap_vars(&a,&b);
		break;
		case 7:
			swap_ptr(&ptr_a,&ptr_b);
		break;
		}
	}while(auswahl != 8);

}

void input (double &a, double &b)
{
	cout<<"Wert #1 eingeben: ";
	cin>>a;
	cout<<"Wert #2 eingeben: ";
	cin>>b;
	cout<<""<<endl;
}

void outputvalue_vars (double a, double b)
{
	cout<<"Wert #1: "<<a<<endl;
	cout<<"Wert #2: "<<b<<endl;
	cout<<""<<endl;
}

void outputvalue_ptr (double *ptr_a, double *ptr_b)
{
	cout<<"Zeiger auf Wert #1: "<<ptr_a<<endl;
	cout<<"Zeiger auf Wert #2: "<<ptr_b<<endl;
	cout<<""<<endl;
}

void outputadress_vars (double *a, double *b)
{
	cout<<"Adresse #1: "<<a<<endl;
	cout<<"Adresse #2: "<<b<<endl;
	cout<<""<<endl;
}

void outputadress_ptr (double **ptr_a, double **ptr_b)
{
	cout<<"Adresse des Zeigers #1: "<<ptr_a<<endl;
	cout<<"Adresse des Zeigers #2: "<<ptr_b<<endl;
	cout<<""<<endl;
}

void swap_vars (double &a, double &b)
{
	double temp=a;
	a=b;
	b=temp;
}

void swap_ptr (double **ptr_a, double **ptr_b)
{
	double *temp=*ptr_a;
	*ptr_a=*ptr_b;
	*ptr_b=temp;
}
 
Es stimmt wieder einmal der Prototyp nicht mit der Implementierung überein - dieses mal ist das die richtige Version
Code:
void swap_vars (double &a, double &b)
 
Das schon nur müsste die Funktion ja damit sie korrekt arbeitet tatsächlich
void swap_vars (double *a, double *b){
double temp=*a;
*a=*b;
*b=temp;
}
auch wenn ers bisher falsch implementiert hat :D Somit kann der Prototyp dann auch stehen bleiben.
@mephi!sto: Bitte auch meinen Edit im vorigen Post noch beachten!
 
Zuletzt bearbeitet:
Wieso, seine Implementierung mit Referenzen sollte mit diesem Prototyp funktionieren
Code:
void swap_vars (double &a, double &b)
 
Habe es nun mal angepasst.
Nun bekomme ich aber wieder eine Fehlermeldung.
case 6:
swap_vars(&a,&b);
break;
error C2664: 'swap_vars': Konvertierung des Parameters 1 von 'double *' in 'double &' nicht möglich

Habt Nachsicht, ich habe wirklich absolut keinen Plan und ich übertreibe nicht !
 
Code:
case 6:
swap_vars(&a,&b);
break;
Wieder mal die Adressoperatoren (& Zeichen) weg ;)
 
Jetzt gehts.
Uff, danke !
Schwere Geburt.
Nun muss ich mir das mal reinziehen -.-
 
Zurück
Oben