Problem mit Call by Reference
-
Hallo Leute,
ich versuch gerade mir das call by reference Verfahren anzueignen. Ich habe auch ein Beispiel aber irgendwie funktioniert es nicht und ich habe es aus einem Script entnommen. Dieses Programm soll zwei Variablen vertauschen ganz simple:#include<stdio.h> #include<stdlib.h> void Austausch (int *x, int *y) { int *hilf = x; x = y; y = hilf; } void main() { int a=1; int b=2; Austausch ( &a, &b); printf("%d %d",a,b); }
Danke !
-
Murphy schrieb:
Hallo Leute,
ich versuch gerade mir das call by reference Verfahren anzueignen. Ich habe auch ein Beispiel aber irgendwie funktioniert es nicht und ich habe es aus einem Script entnommen. Dieses Programm soll zwei Variablen vertauschen ganz simple:[cpp]
#include<stdio.h>
#include<stdlib.h>void Austausch (int *x, int *y)
{
int hilf = *x;
*x = *y;
*y = hilf;
}void Austausch (int &x, int &y)
{
int hilf = x;
x = y;
y = hilf;
}int main()
{
int a=1;
int b=2;Austausch ( &a, &b);
printf("%d %d",a,b);Austausch ( a, b);
printf("%d %d",a,b);}
[/cpp]Danke !
-
wenn du es so anschreibst wie du, kannst du nur die werte aendern da die zeiger temporaer sind
zb:
/* diese funktion tauscht die Zahlenwerte aus */ void Austausch_Werte(int *x, int *y) { int hilf = *x; *x = *y; *y = hilf; }
-
du änderst die zeiger und nicht die variablen auf die sie zeigen. Richtig wärs also:
void Austausch (int *x, int *y) { int hilf = *x; *x = *y; *y = hilf; }
-
uhhhhhhaaaaa.........was ist das? Kannst du mir das auch erklären ???
wo liegt der unterschied zwischen beiden !
-
Murphy schrieb:
uhhhhhhaaaaa.........was ist das? Kannst du mir das auch erklären ???
wo liegt der unterschied zwischen beiden !
wen meinste jetzt?
-
#include <cstdlib> // C++ header #include <iostream> void Austausch(int* x, int* y) { int hilf = *x; // wir wollen die inhalte *x = *y; // von *x und *y vertauschen *y = hilf; // und nicht die zeiger, die } // sowiso nur lokal existieren int main() // jeder process gibt einen exitcode zurück, { // daher ist int main vorgeschrieben int a = 1, b = 2; Austausch( &a, &b ); std::cout << a << '\t' << b << std::endl; // printf ist erheblich // komplizierter und // fehleranfälliger als std::cout return EXIT_SUCCESS; }
-
ok .... hat sich schon erledigt!
Habs verstanden! Dann steht es in meinen Unterlagen falsch!Danke schön !
-
Murphy schrieb:
uhhhhhhaaaaa.........was ist das? Kannst du mir das auch erklären ???
wo liegt der unterschied zwischen beiden !
es gibt keinen
-
das ganze per reference:
#include <cstdlib> #include <iostream> void Austausch(int& x, int& y) { int hilf = x; x = y; y = hilf; } int main() { int a = 1, b = 2; Austausch( a, b ); std::cout << a << '\t' << b << std::endl; return EXIT_SUCCESS; }
insbesondere die andere aufrufsyntax macht viel besser klar, was vertauscht wird.
-
noch ein kleiner zusatz, so geht es auch:
void Austausch(int& x, int& y) { y ^= x; x ^= y; y ^= x; }
-
#include <utility> #include <iostream> int main() { int a = 1, b = 2; std::swap( a, b ); std::cout << a << '\t' << b << std::endl; return EXIT_SUCCESS; }
-
ssm schrieb:
#include <utility> #include <iostream> int main() { int a = 1, b = 2; std::swap( a, b ); std::cout << a << '\t' << b << std::endl; return EXIT_SUCCESS; }
tja, aber was lernt man dabei?
-
camper schrieb:
tja, aber was lernt man dabei?
STL :p
-
camper schrieb:
tja, aber was lernt man dabei?
Nicht das Rad jedes mal neu zu erfinden. Und den Code versteht garantiert JEDER, der std::swap() kennt.
-
camper schrieb:
noch ein kleiner zusatz, so geht es auch:
void Austausch(int& x, int& y) { y ^= x; x ^= y; y ^= x; }
Ist das eigentlich performanter?
@ssm: Sollte das nicht so aussehen:
std::swap<int>(a,b);
oder gibts für int ne Spezialisierung?
MfG SideWinder[pclex]
-
BTW: Steckt swap nicht in der algorithm?
*komplett verwirrt bin jetzt*
MfG SideWinder
-
beides, is im std namespace aber auch bei den algos dabei
-
leo aka qsch schrieb:
beides, is im std namespace aber auch bei den algos dabei
"beides, ist im Haus aber auch im Wohnzimmer" passt nicht zu "Ists im Wohnzimmer oder im Esszimmer"
MfG SideWinder
-
SideWinder schrieb:
oder gibts für int ne Spezialisierung?
wozu braucht man eine Spezialisierung für sowas???
template<typename T> void swap(T &t1, T &t2) { T tmp = t1; t1 = t2; t2 = tmp; }
Compiler soll in der Lage sein, solche Dinge selbst zu machen. Wenn dein Compiler sowas nich kann, schmeiß ihn in Mühl
!!!