Funktion Fläche_Garten funktioniert nicht
-
Hallo liebe Gemeinde.
Kann jemand bitte über folgenden Programmcode drüber schauen:
#include <iostream> using namespace std; float Fläche(float , float); int main() { float Garten_Fläche, Garten_Länge, Garten_Breite; Garten_Fläche = Fläche (Garten_Länge, Garten_Breite); cout << "Die Flaeche Ihres Gartens betraegt: "; cout << Garten_Fläche; cout << " Quadratmeter!" << endl; return 0; } float Fläche(float Garten_Länge, float Garten_Breite) { cout << "Wie breit ist Ihr Garten?" << endl; cin >> Garten_Länge; cout << "Wie lang ist Ihr Garten?" << endl; cin >> Garten_Breite; return Garten_Länge*Garten_Breite; }Hier sind die Fehlermeldungen, die ich immer bekomme:
1>d:\benutzer\maximilian\eigene dokumente\visual studio 2010\projects\cpp - programmierung\listing 05.01-verwendung einer funktion\verwendung einer funktion.cpp(9): warning C4700: Die nicht initialisierte lokale Variable "Garten_Breite" wurde verwendet. 1>d:\benutzer\maximilian\eigene dokumente\visual studio 2010\projects\cpp - programmierung\listing 05.01-verwendung einer funktion\verwendung einer funktion.cpp(9): warning C4700: Die nicht initialisierte lokale Variable "Garten_Länge" wurde verwendet.Ich verstehe leider nicht, warum der Compiler immer diese beiden Fehlermeldungen bringt, da ich doch Funktionsprototyp, die main() und die Funktion an sich richtig programmiert habe??
Danke schon mal für´s darüber schauen.
Gruß
Max
-
- Ist das ein Warning und kein Error (==Fehler)
- Sagt die Meldung doch alles, was man wissen soll: die beiden Variablen sind nicht initialisiert (es steht einfach irgend ein Mist drinnen, was halt gerade im Speicher an der Stelle steht)
- sind nur ASCII-Zeichen für Bezeichner erlaubt, ä, ö, ü usw gehören da nicht dazu.
-
arghonaut schrieb:
- Sagt die Meldung doch alles, was man wissen soll: die beiden Variablen sind nicht initialisiert (es steht einfach irgend ein Mist drinnen, was halt gerade im Speicher an der Stelle steht)
- sind nur ASCII-Zeichen für Bezeichner erlaubt, ä, ö, ü usw gehören da nicht dazu.
Was meinst Du mit initialisieren?
Ich habe es jetzt so hinbekommen:
#include <iostream> using namespace std; float Flaeche(float Garten_Laenge, float Garten_Breite) { return Garten_Laenge*Garten_Breite; } int main() { float Garten_Flaeche, Garten_Laenge, Garten_Breite; cout << "Wie breit ist Ihr Garten?" << endl; cin >> Garten_Laenge; cout << "Wie lang ist Ihr Garten?" << endl; cin >> Garten_Breite; Garten_Flaeche = Flaeche (Garten_Laenge, Garten_Breite); cout << "Die Flaeche Ihres Gartens betraegt: "; cout << Garten_Flaeche; cout << " Quadratmeter!" << endl; return 0; }Meine Fragen nun:
Warum kann man die Zeilen 12 bis 15 nicht in die Funktion schreiben?
-
Du hast ihnen keinen Anfangswert zu geschrieben, alles außer globalen und static variablen hat einen zufälligen anfangswert.
-
silent_max schrieb:
Meine Fragen nun:
Warum kann man die Zeilen 12 bis 15 nicht in die Funktion schreiben?
Kann man und es funktioniert in deinem Programm beides gleich, macht aber vermutlich nicht das, was du glaubst. Du solltest in deinem Buch noch mal unter "Parameter" nachlesen.
-
Du übergibst an Flaeche eine Kopie von Garten_Länge und Garten_Breite. Die Werte der Variablen in der aufrufenden Funktion werden nicht geändert. Du musst entweder eine Referenz oder einen Zeiger übergeben, also:
Referenz: float Flaeche(float& Garten_Laenge, float& Garten_Breite)
Zeiger: float Flaeche(float *Garten_Laenge, float *Garten_Breite)Bei der Übergabe als Zeiger muss der Aufruf heißen:
Garten_Flaeche = Flaeche (&Garten_Laenge, &Garten_Breite);
und in Fläche: cin>>*Garten_Laenge; cin>>*Garten_Breite;Ansonsten sind Umlaute in Variablennamen nicht erlaubt!
-
Bonni4355 schrieb:
Du übergibst an Flaeche eine Kopie von Garten_Länge und Garten_Breite. Die Werte der Variablen in der aufrufenden Funktion werden nicht geändert. Du musst entweder eine Referenz oder einen Zeiger übergeben,
Und was bitte soll das bringen? Genau, gar nichts. Eben weil die Werte nicht verändert werden reicht eine Kopie. Bei Typen, bei denen Kopien teuer sind, kann man über einen const T& als Parameter nachdenken. Aber dein Vorschlag mit non-const-ref oder nocn-const-ptr schießt voll am Ziel vorbei - beide sagen "ich werde verändert", beim Zeiger sogar "ich kann NULL sein"!
-
arghonaut schrieb:
Bonni4355 schrieb:
Du übergibst an Flaeche eine Kopie von Garten_Länge und Garten_Breite. Die Werte der Variablen in der aufrufenden Funktion werden nicht geändert. Du musst entweder eine Referenz oder einen Zeiger übergeben,
Und was bitte soll das bringen? Genau, gar nichts. Eben weil die Werte nicht verändert werden reicht eine Kopie. Bei Typen, bei denen Kopien teuer sind, kann man über einen const T& als Parameter nachdenken. Aber dein Vorschlag mit non-const-ref oder nocn-const-ptr schießt voll am Ziel vorbei - beide sagen "ich werde verändert", beim Zeiger sogar "ich kann NULL sein"!
Du hast recht. Ich habe mir die erste Funktion nicht richtig angeschaut. Ich dachte, er wollte die Werte in Flaeche abfragen und mit dem Ergebnis in main rechnen. Warum übergibt er denn überhaupt Garten_Laenge und Garten_Breite als Parameter?
Sorry