Probleme mit Funktionen und IF-Else Anweisungen
-
... if (Funktion(num1, num2) > 0){ printf("%d VW", Funktion(num1, num2)); } else if (Funktion(num1, num2) == 0){ printf("%d Toyota", Funktion(num1, num2)); } else if (Funktion(num1, num2) < 0){ printf("%d Tesla", Funktion(num1, num2)); } ...
So sollte das Ergebnis aussehen (Beispiel vereinfacht)
If > 0.........Output '3 VW'
If == 0......Output '0 Toyota'
If < 0.........Output '-2 Tesla'Leider wird das Ergebnis eher so angezeigt:
If > 0.........Output '3 VW' //Hier stimmt es schon mal.
If == 0......Output '0 VW' // Wenn das Ergebnis 0 ist, landet das Ergebnis aber in der ersten IF Anweisung
If < 0.........Output '0 VW' // Wenn das Ergebnis kleiner 0 ist, wird trotzdem die zweite Lösung angezeigt.Der restliche Code stimmt auf jeden Fall. Ich hab alles sauber deklariert
und nur integer Zahlen eingesetzt. Problem gibt es hier vermutlich nur mit der Anweisung.
Fehlermeldung gibt es auch keine.Was könnte da falsch sein?
Danke im Voraus für eure Mühe!
-
NunChuck schrieb:
Der restliche Code stimmt auf jeden Fall. Ich hab alles sauber deklariert und nur integer Zahlen eingesetzt. Problem gibt es hier vermutlich nur mit der Anweisung.
Fehlermeldung gibt es auch keine.Den richtigen restlichen Code würde ich auch gerne sehen. Siehe: Wie man Probleme nachstellbar und nachvollziehbar macht
Weiterhin würde ich vor demif
eine Variable spendieren, die das Ergebnis vonFunktion()
zwischenspeichert...der Lesbarkeit wegen.const int tmp = Funktion(num1, num2); if (tmp > 0){ printf("%d VW", tmp); } ...
-
Hi,
den entscheidenden Quellcode hast du uns hier nicht gezeigt!
Den Quellcode der Funktion namens "Funktion(...)". Da wirst du bestimmt irgendwelche globalen Variablen drin verwenden, die dann bei einem 2. Aufruf von Funktion auf einmal für ein anderes Ergebnis liefern, als beim 1. Aufruf bei deinen if-Abfragen.
umgehen könnte man das
a) in dem man globale Variablen vermeidet
b) dafür sorgt, dass Funktion nur einmal aufgerufen wird.... int result = Funktion(num1, num2); if (result > 0){ printf("%d VW", result ); } else if (result == 0){ printf("%d Toyota", result); } else if (result < 0){ printf("%d Tesla", result); } ...
-
Erstmal vielen Dank für eure Antworten.
Es gibt keinen 1. oder 2. Aufruf.
Für jede neue Eingabe muss ich die .exe neustarten.
Globale Variablen habe ich auch nicht deklariert. Ich versucht noch ein
paar Sachen und wenn das nicht klappt, poste ich das gesamt Programm.
-
NunChuck schrieb:
Erstmal vielen Dank für eure Antworten.
Es gibt keinen 1. oder 2. Aufruf.
Für jede neue Eingabe muss ich die .exe neustarten.
Globale Variablen habe ich auch nicht deklariert. Ich versucht noch ein
paar Sachen und wenn das nicht klappt, poste ich das gesamt Programm.Natürlich gibt es da mehrere Aufrüfe der Funktion namens "Funktion".
Einmal in den if-Bedingungen, da kann die Funktion bis zu 3 mal aufgerufen werden, wenn die ersten 2 Bedingungen nicht zutreffen. Und dann noch zusätzlich ein Aufruf der Funktion im printf().
if (Funktion(num1, num2) > 0){ // hier die Funktion zum ersten Mal aufgerufen printf("%d VW", Funktion(num1, num2)); } else if (Funktion(num1, num2) == 0){ // hier evtl. ein 2. Mal wenn die erste // if-Bedingung falsch war printf("%d Toyota", Funktion(num1, num2)); } else if (Funktion(num1, num2) < 0){ // hier evtl. ein 3. Mal wenn die erste // if-Bedingung falsch war printf("%d Tesla", Funktion(num1, num2)); // und hier dann ein 4. Mal }
-
DaFehltNochWas schrieb:
Natürlich gibt es da mehrere Aufrüfe der Funktion namens "Funktion".
Einmal in den if-Bedingungen, da kann die Funktion bis zu 3 mal aufgerufen werden, wenn die ersten 2 Bedingungen nicht zutreffen. Und dann noch zusätzlich ein Aufruf der Funktion im printf().
Verstehe das nicht ganz. Ist es schlecht, wenn Funktionen mehrmals
aufgerufen werden?^^
-
Ohne den restlichen Code können wir nur raten. Dein Problem ist wohl, dass die Funktion unabhängig von den Parametern immer einen Wert > 0 zurückgibt,
das solltest du überprüfen. Dass die Funktion so oft aufgerufen wird ist denke ich nicht ausschlaggebend, allerdings ist es natürlich total unnötig.
-
NunChuck schrieb:
DaFehltNochWas schrieb:
Natürlich gibt es da mehrere Aufrüfe der Funktion namens "Funktion".
Einmal in den if-Bedingungen, da kann die Funktion bis zu 3 mal aufgerufen werden, wenn die ersten 2 Bedingungen nicht zutreffen. Und dann noch zusätzlich ein Aufruf der Funktion im printf().
Verstehe das nicht ganz. Ist es schlecht, wenn Funktionen mehrmals
aufgerufen werden?^^Warum die Arbeit mehrmals machen, wenn einmal reicht?
Der Compiler kann nicht unbedingt wissen, ob die Funktion bei denselben Argumenten auch dasselbe Ergebnis liefert.
Aslo wird sie jedesmal aufgerufen.
-
^^ Also erstmal würde sich für das konstrukt eher eher eine switch case Anweisung besser machen, vorausgesetzt du gibst nicht die Werte der Rechnung aus sondern per 3 return Werten 1, 0, -1 oder Zahlen die dir halt gefallen, da ich vermute das es dir egal ist welche Zahl nun da genau raus kommt, hauptsache sie sind halt entweder positiv, negativ oder null.
Dann bin ich mir nicht ganz sicher, aber ich könnte raten das du eine unsigned variable irgendwo nutzt, welche einen negativen Wert nun unmöglich macht.
-
NunChuck schrieb:
Verstehe das nicht ganz. Ist es schlecht, wenn Funktionen mehrmals
aufgerufen werden?^^jaein, wobei die Antwort ehe zu ja tendiert.
Wenn eine Funktion sehr teuer ist (teuer im Sinne, dass sie viel Zeit und/oder Speicher in Anspruch nimmt), dann macht es keinen Sinn, sie mehrfach auszuwerten, denn das führt dazu, dass man den teuren Prozess mehrmal sinnlos ausführt (setzt in Voraus, dass die Funktion den selben Wert zurückgibt mit den gleichen Parametern).
Die Antwort nein könnte man nur geben, wenn man z.B. eine Funktion hat, die obwohl sie mit gleichen Parametern aufgerufen wird, unterschiedliche Ergebnisse ausgibt, z.b. eine Funktion wie
int choose_randomly(int x, int y) { return rand()%2 ? x : y; // wenn rand() gerade dann x sonst y }
ob jemals vorkommt, dass man eine solche Funktion so verwendet
if(choose_randomly(1,2) == 1) ... else if(choose_randomly(1,2) == 2) ...
ist eine andere Sache.
Der Punkt ist, dass man schon wissen soll, was die aufgerufene Funktion macht und zurückgibt. Wenn du weißt, dass die Funktion mit den selben Parameters stets das selbe Ergebnis zurückliefert, dann mancht es keinen Sinn, sie mehrfach auszuführen.