'zahl' declared as reference but not initializied



  • Hallo Leute,
    ich bin ein Anfänger was C/C++ angeht und hoffe Ihr nehmt mir mein kleines Problem nicht zu übel. Wie aus dem Titel entnehmend habe ich einen Error: 'zahl' declared as reference but not initialized

    #include <iostream>
    #include <cstdlib>
    using namespace std;
    
    void eingabe(double* z);
    
    int main(int argc, char **argv) {
    
    	int Spiel1[5];
    	int lauf = 0;
    	double &zahl;
    
    	for (lauf = 0; lauf <= 6; lauf++) {
    		Spiel1[lauf] = -1;
    	}
    
    	cout << "Hallo, dies ist das Lottoverwaltungsprogramm.\n\n";
    
    	do {
    		double zahl = 6.0;
    		eingabe(&zahl); //speichert Adresse
    		cout << zahl;
    	} while (zahl <= 1 || zahl >= 50);
    }
    
    double eingabe(float *z) {
    
    	*z = *z + *z + *z + *z + *z + *z;
    	cout << *z << endl; //Wenn man * weglässt, zeigt er die Speicheradresse
    	*z = *z % 6;
    	cout << "Das ist Ihre Durchschnittszahl:" << *z << endl;
    
    }
    

    Ich habe vor sechs beliebige Zahl einzugeben, habe aber die Zahl 6.0 angegeben, damit ich das Programm erstmal so in Betrieb nehmen kann. Dann habe ich mir überlegt, die Durchschnittszahl errechnen zu lassen, habe aber keinen Plan, ob das so möglich ist, wegen dem geschilderten Error.

    Hoffe Ihr könnt mir da fix helfen!

    /edit pumuckl: cpp-Tags. Zukünftig bitte selbst machen!



  • Warum deklarierst du

    double &zahl;
    

    als Referenz?

    Ich habe den Code nicht ganz genau angesehen (weil kaum lesbar, da keine cpp Tags), aber möchtest du da nicht eine "normale" Variable haben:

    double zahl;
    

    *Edit
    Du bist übrigens noch im falschen Unterforum.



  • Ich arbeite immer an dem "je weniger Errors - desto besser - Prinzip". Wenn ich double &zahl; zu double zahl; ändere gibt er mir nur weitere Fehlermeldungen

    #include <iostream>
    #include <cstdlib>
    using namespace std;
    
    void eingabe(double* z);
    
    int main(int argc, char **argv) {
    
    	int Spiel1[5];
    	int lauf = 0;
    	double zahl;
    
    	for (lauf = 0; lauf <= 6; lauf++) {
    		Spiel1[lauf] = -1;
    	}
    
    	cout << "Hallo, dies ist das Lottoverwaltungsprogramm.\n\n";
    
    	do {
    		double zahl = 6.0;
    		eingabe(&zahl); //speichert Adresse
    		cout << zahl;
    	} while (zahl <= 1 || zahl >= 50);
    }
    
    double eingabe(float *z) {
    
    	*z = *z + *z + *z + *z + *z + *z;
    	cout << *z << endl; //Wenn man * weglässt, zeigt er die Speicheradresse
    	*z = *z % 6;
    	cout << "Das ist Ihre Durchschnittszahl:" << *z << endl;
    
    }
    


  • kann das hier jemanden dann bitte verschieben 😉



  • Gast192 schrieb:

    Ich arbeite immer an dem "je weniger Errors - desto besser - Prinzip".

    Ganz schlechtes Prinzip. Der Compiler kann nämlich nur Syntax überprüfen, aber nicht die Semantik deines Programms.

    Das Problem ist, dass ich deinen Code überhaupt nicht verstehe. Du deklarierst z.B. die Funktion eingabe als void, implementierst sie dann aber mit double-Rückgabewert, gibst aber nichts zurück.

    Hier mal etwas Code, wie die Eingabe einer Zahl in etwa aussehen könnte (ohne komplizierte Pointer und Referenzen):

    double eingabe(); 
    
    int main(int argc, char **argv) { 
    	int input;
        input = eingabe();
    	cout << input << endl;
    } 
    
    double eingabe() { 
    	double z;
    	cin >> z; // Hier wird die Eingabe gelesen und in z gespeichert
    	return z; // Eingabe wird zurückgegeben
    }
    


  • Ich würde es aber gerne mit Referenzen machen, weil mir das noch nicht so gut liegt.



  • Dann hier mit Referenzen:

    #include <iostream> 
    #include <cstdlib> 
    using namespace std; 
    
    void eingabe(double & zahl); 
    
    int main(int argc, char **argv) 
    { 
    	double input;
        eingabe(input);
    	cout << input << endl;
    } 
    
    void eingabe(double & zahl) 
    { 
    	cin >> zahl; // Hier wird die Eingabe gelesen und in z gespeichert
    	zahl *= 6; // Hier kannst du mit der Zahl rechen oder was auch immer
    }
    


  • Danke dir bis hierhin!
    Bekomm es aber noch nicht hin statt der 6 eine andere Zahl die ich eingeben kann da ausrechnen zu lassen



  • Gast192 schrieb:

    Danke dir bis hierhin!
    Bekomm es aber noch nicht hin statt der 6 eine andere Zahl die ich eingeben kann da ausrechnen zu lassen

    Bin mir nicht ganz sicher was du meinst. Zeig mal den Code, den du bis jetzt hast.



  • #include <iostream> 
    #include <cstdlib> 
    using namespace std; 
    
    void eingabe(double & zahl); 
    
    int main(int argc, char **argv) 
    { 
        double input; 
        eingabe(input); 
        cout << input << endl;
        //*1 evtl hier die zweite Eingabe machen
    } 
    
    void eingabe(double & zahl) 
    { 
        cin >> zahl; // Hier wird die Eingabe gelesen und in z gespeichert 
        zahl *= 6; //*1 und hier statt mit der 6 mit der eingegebenen Zahl multiplizieren
    }
    


  • Die Frage ist nun, woher die zusätzliche Zahl kommt.

    Du kannst sie an die Funktion übergeben, dann sieht die Funktion so aus:

    void eingabe(double & zahl, double zahl_2) 
    { 
        cin >> zahl; // Hier wird die Eingabe gelesen und in z gespeichert 
        zahl *= zahl_2; //*1 und hier statt mit der 6 mit der eingegebenen Zahl multiplizieren
    }
    

    Du kannst aber auch die Zahl in der Funktion selber einlesen:

    void eingabe(double & zahl) 
    { 
    	double zahl_2;
    	cin >> zahl_2;
        cin >> zahl; // Hier wird die Eingabe gelesen und in z gespeichert 
        zahl *= zahl_2; //*1 und hier statt mit der 6 mit der eingegebenen Zahl multiplizieren
    }
    

    Kannst dir eine der beiden Versionen aussuchen.



  • Auch danke hierfür :p

    bisher kann ich nur 3 Zahlen eingeben. Wenn ich die Funktion am Schluss ändere und vervielfache, werden nur die letzten beiden Zahlen multipliziert. Wie kann ich also z. B. statt nur 2 Zahlen einzugeben 3 Zahlen eingeben?



  • nur *2 Zahlen eingeben



  • Gegenfrage: Was genau hast du eigentlich vor?

    Wenn du mehrere Zahlen nach einem festgelegten Muster einlesen und verarbeiten willst, dann kannst du deine Funktion schreiben, daß sie genau das erledigt. Ansonsten könntest du es auch mit Schleifen und/oder Arrays probieren.



  • Ich denke mal ich will einen Zeiger für Arrays wäre da besser, damit ich nicht jeden Wert deklarieren muss, oder?



  • Dieser Thread wurde von Moderator/in Jochen Kalmbach aus dem Forum C++/CLI mit .NET in das Forum C++ (auch C++0x) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Gast192 schrieb:

    Ich denke mal ich will einen Zeiger für Arrays wäre da besser, damit ich nicht jeden Wert deklarieren muss, oder?

    In deinem ersten posting dieses threads steht, dass du 6 Zahlen eingeben und dann den Durchschnittswert berechnen möchtest.
    Wie du eine Zahl einliest weisst du ja mitlerweile.
    Nun musst du dir doch nur noch überlegen wie du 6 Zahlen einliest (Stichwort: schleife).

    Den Durchschnitt zu berechnen sollte dann doch kein Problem mehr sein oder?

    Welches Problem hast du nun bei der Umsetzung?



  • #include <iostream>
    #include <cstdlib>
    using namespace std;
    
    void eingabe(double & zahl);
    
    int main(int argc, char **argv) {
    	for (int lauf = 0; lauf <= 6; lauf++) {
    		double input;
    		eingabe(input);
    		cout << input << endl;
    	}
    	while (input >= 1 || input <= 49)
    		;
    }
    
    void eingabe(double & zahl) {
    	double zahl[4];
    	cin >> zahl[4];
    	cin >> zahl; // Hier wird die Eingabe gelesen und in z gespeichert
    }
    

    Das ist mein bisheriger Code. Nur zeigt er mir wieder Fehlermeldungen:
    line 13: 'input' was not declared in this scope
    line 18: declaration of 'double zahl[4]' shadows a parameter
    line 20: no match for 'opderator>>'std::cin>>zahl'

    Wie ihr sehen könnt habe ich ebenfalls ein Zahlenbereich gesetzt, welchen ich gern beibehalten würde



  • line 13: 'input' was not declared in this scope
    Schau dir mal das hier an:

    for (int lauf = 0; lauf <= 6; lauf++) {
    		double input;
    		eingabe(input);
    		cout << input << endl;
    	}
    	while (input >= 1 || input <= 49)
    		;
    

    Hier wird in der Schleife die Variable input definiert, die nach der Schleife nicht mehr existiert, und daher kann auch nicht drauf zugegriffen werden.

    line 18: declaration of 'double zahl[4]' shadows a parameter

    void eingabe(double & zahl) { //(1)
        double zahl[4];   //(2)
        cin >> zahl[4];   //(3)
        cin >> zahl; //(4)
    }
    

    Hier definierst du an Stelle (2) ein double-Array mit Namen "zahl". Das ist eine andere Variable als der Parameter "zahl", den du an (1) definiert hast. Der ist deshalb nicht mehr sichtbar in der Funktion.
    Was du an (3) machst ist sicher nicht das, was du glaubst zu tun (wobei ich mir nicht sicher bin was du überhaupt glaubst zu tun): hier wird die Zahl an der 5ten Stelle des Arrays eingelesen. Dummerweise hat dein Array nur 4 Elemente, daher erzeugt das hier undefiniertes Verhalten.
    An (4) meckert der Compiler, weil du nicht in die Referenz aus (1) einliest, sondern in einen Pointer auf das Array, das du in (2) defniiert hast. (Die Definition von (1) ist ja versteckt worden). Und um einen Pointer auf double einzulesen gibts keinen passenden operator>>, daher die Fehlermeldung.

    Ich würde dir dringend raten, nochmal gründlich die ersten Kapitel im C++-Buch deiner Wahl durchzuarbeiten, es scheint als hättest du da einige Grundlagen noch nicht ganz verinnerlicht.


Log in to reply