Funktion aus Funktion aufrufen
-
Hallo Freunde,
Es funktioniert allgemein.
Aber, warum funktioniert der Aufruf von Fnkt "pruefer" von Fnkt. "szamolo" aus nicht? Szamolo ist immer 2 im Print. Er soll den Inhalt der Var. "szam" immer bis 6 hochzählen, und dann auf zwei zurücksetzen.Es geht mir nicht um das Problem, sondern um das Verstehen der Werteübergabe. Mit if und else hab ich kapiert.
#include <iostream> using namespace std; int bx; int ax; int zx; int pruefer(int zaehlerstand, int prf) //hier sollen Werte, egal woher, geprüft werden { if (zaehlerstand==prf) { zaehlerstand=2; } return zaehlerstand; } int counter() { zx++; return zx; } int szamolo(int szam)// auch ein Zähler mit Prüfung { szam=szam+2; pruefer(szam,6); return szam; } int main() { int n; int ax; for(int a=1; a<20; a++) { cout<<"ax "<<ax<<" "; n = counter(); cout<<szamolo(bx)<<" =Szamolo "; cout<<"n= "<<n<< " Tag "<< pruefer(8, n) <<" "; cout<<"a= "<<a<< " WTag "<< pruefer(a, 6) <<endl; } return 0; }
-
Du übergibst die int per value, du willst aber wohl per Reference übergeben.
Dein Code macht auch nicht das, was du dir denkst.
Was Call by Reference ist kannst du in deinem Buch/Tutorial/Google nachlesen. Sind Grundlagen, die du dir aneignen solltest..
-
Hallo,
"Call by reference" und "Call by value" waren die entscheidenden Stichworte.
Sehr schön ist das hier erklärt:
1: http://abraham.fh-lausitz.de/profs/robel/faq/callByValue.html
2: http://abraham.fh-lausitz.de/profs/robel/faq/callByReference.htmlGibt's da eigentlich auch deutsche Ausdrücke dafür?
Danke
-
Bekell schrieb:
Gibt's da eigentlich auch deutsche Ausdrücke dafür?
Soweit ich weiß werden nur die englischen Ausdrücke genommen.
@Bekell:
Du hast nun schon mehrere Threads hier eröffnet, immer mit Fragen, die du auf jeder Seite gut erklärt bekommst. Lernst und arbeitest du nach dem Zufallsprinzip, auf die Art "Learning by doing"? C++ kann man aber nicht ohne Beihilfe eines Buches oder Tutorials lernen(Tutorial ist oft abzuraten). Außerdem ist mir dein schlechter Stil aufgefallen. Ich weiß jetzt nicht genau was dein Programm überhaupt machen soll, aber momentan ist die Funktion eingebaut, dass er wieder bei 2 anfängt#include <iostream> using namespace std; //globale Variablen zeugen von schlechtem Stil, es kann Situationen geben, in denen //man sie brauch, natürlich, hier aber nicht! int pruefer(int &zaehlerstand, int prf) //hier sollen Werte, egal woher, geprüft werden { if (zaehlerstand == prf) { zaehlerstand = 2; } return zaehlerstand; } int counter(int &zx) { return ++zx; } int szamolo(int &szam) // auch ein Zähler mit Prüfung { szam = szam + 2; return pruefer(szam, 6); } int main() { int n = 0; int ax = 0; //wofür ax? du machst damit nichts int zx = 0; int bx = 0; for(int i = 1; i < 20; i++) //für gewöhnlich wird hier i genutzt, Schleife wird nur 18 mal durchgeführt { counter(zx); cout << "ax " << ax << " "; cout << szamolo(bx) << " =Szamolo "; cout << "n= " << n << " Tag " << pruefer(zx, 8) << " "; //du hattest die funktion falsch aufgerufen cout << "i= " << i << " WTag " << pruefer(zx, 6) << endl; } }Wir helfen immer gerne, aber tu uns auch den Gefallen: www.google.de -> C++ Tutorial
Deine Fragen sind teilweise echt grausam.
-
Referenzübergabe, Wertübergabe ?
-
Danke erstmal, das war nicht einfach. Ich habe jetzt die Prüfwerte in Zeile 36/37 auch als Referenz übergeben, indem ich in Zeile 26/27 Variablen kreiert habe.
1. Wie kann man jetzt ganz elegant den Prüfwert auch dynamisieren? ZB. soll er erst bis 5, dann bis 10, dann wieder bis 5, wieder bis 10 u.s.w. u.s.f. zählen.
2. In main, kann man da nicht ax und bx auch irgendwie in eine Variable bringen? Man würde dann eine ganze Zeile sparen.
3. In Zeile 38 hatte der freundliche Helfer geschrieben "du hattest die funktion falsch aufgerufen". Ich hatte das zur Probe mal umgedreht. War auch ein spannendes Ergebnis. Gibt es eine Regel, das Werte nur an das Ende einer Indexreihe kommen?
#include <iostream> using namespace std; int pruefer(int &zaehlerstand, int prf) //hier sollen Werte, egal woher, geprüft werden { if (zaehlerstand == prf) { zaehlerstand = 1; } return zaehlerstand; } int counter(int &zx) { return ++zx; } int szamolo1(int &szam, int &sim) // auch ein Zähler mit Prüfung { szam = szam + 1; return pruefer(szam, sim); } int main() { int x = 8; int y = 10; int n = 0; int ax = 0; int bx = 0; int zx = 0; for(int i = 1; i < 30; i++) //für gewöhnlich wird hier i genutzt, Schleife wird nur 18 mal durchgeführt { cout<<counter(zx)<<" zx "; cout<<counter(n)<<" n "; cout << szamolo1(ax, x) << " = Hixi "; cout << szamolo1(bx, y) << " = Huxi "; cout << "n= " << n << " Pixi " << pruefer(zx, 8) << " "; //du hattest die funktion falsch aufgerufen cout << "i= " << i << " Puxi " << pruefer(zx, 6) << endl; } }Ich danke jedem, der mir feiwillig hilft von ganzem Herzen. Auch wenn ich selber lerne, man braucht doch Kommunikation. Soll ich denn immer mit "Anfängerfrage" titeln?
-
Bekell schrieb:
Ich danke jedem, der mir feiwillig hilft von ganzem Herzen. Auch wenn ich selber lerne, man braucht doch Kommunikation. Soll ich denn immer mit "Anfängerfrage" titeln?
Nein, du sollst endlich, wie schon X TAUSEND MAL gesagt, ein Anfänger Tutorial oder Buch lesen. Wir sind ein Forum, wo Freiwillige Hilfe geben, daher dürfen wir wohl auch ein wenig etwas von einem Hilfesuchenden erwarten, nämlich dass er selber kaut und nicht wie ein kleines Kind noch Brei erhalten muss. Wenn du nicht lernst selber zu kauen, dann kannst du es sowieso gleich mit der Programmierung vergessen.

Grüssli