Fehler "Nicht initalisierte lokale Variable", hilfe ?



  • Hallo,

    bin erst seit kurzem dabei ein wenig c++ zu programmieren. Eigentlich sollte es ein recht simples Porgramm werden mit dem ich Durchmesser einlese und den Größten Durchmesser ausgeben kann. Leider sind fehler aufgetreten die ich persönlich nicht korrigiert bekomme. Hoffe jemand kann mir schnell helfen.

    Er führt das Progamm zwar aus aber mit den Fehlern:

    - n sei nicht initalisierte lokale variable (habe sie doch aber initailiesiert)
    - max sei nicht initaliesiert ....... (auch eigentlich initaliesiert)

    Mein Quelltext wie folgt:

    #include <conio.h>
    #include <stdlib.h>
    #include <iostream>
    
    using namespace std;
    #define nmax 100 
    #define pi 3.1415926
    
    int lies(int n, double d[])
    {  
    		 n=0;							
    		do{	cout<<"\n Durchmesser des "<<n+1<<". Elementes (Ende bei <=0):";
    		cin>>d[n];
    		if(d[n]<=0) break;
    		n++;
    		}while(n<nmax);
    	return n;		
    }
    double maximum(int i ,double d[nmax])
    {  
    	double max;
    	for(i=0;i<=nmax;i++){
    		if (d[i]>max)
    			max = d[i];
    						}
    	return max;
    		cout<< "\n Der maximale Durchmesser beträgt"<<max<<endl;
    		cout<< "\n Das maximale Volumen beträgt : "<<pi/6*max*max*max<< endl;
    
    }
    int main()
    {   char men ;	int n; double a[nmax] ;
    	do
    	{	cout<<"--Startmenue--"<<endl;
    		cout<<"\n (1) - Durchmesser eingeben"<<endl;
    		cout<< "\n (2) - Größter Durchmesser und Volumen sind: "<<endl;
    		cout<< "\n (0) - Ende "<<endl;
    
    		cout<<"\n Eingabe : ";
    		cin>> men;
    
    	switch(men)
    	{ 
    		case ('1'): lies (n,a);
    		break;
    
    		case ('2'): if(n>0)maximum(n,a);
    					else cout<<"\n Keine Daten vorhanden!\n"; break;
    		break;
    
    		case ('0'): cout<< "Programm beendet"<<endl;
    		break;
    
    		default: cout << "Falsche Eingabe!" << endl;
    	}
    	getch();
    	system("cls");
    
    	}while( men=! 0);
    
    cin.ignore();
    
    return 0;
    }
     /*------------------------------------------------------------------------*/
    

    Vielen Dank für euer Aufmerksamkeit.

    MFG
    vanhonk



  • Es geht um die Variable n deiner main-Funktion. Die hast du nicht initialisiert (Zeile 34).



  • Der Compiler meckert wahrscheinlich über das n in Zeile 34 und das max in Zeile 23. Diese sind beide nicht initialisiert.
    Dein Compiler wird dir aber vermutlich die Zeilennummern verraten, oder?
    Ach ja, warum setzt du in Zeile 13 den übergebenen Parameter auf 0, was für einen Sinn macht dann dieser?
    Dass es läuft, kann daran liegen, dass du die Debugversion testet, bei der lokale Variablen von vielen Compilern mit 0 initialisiert werden.



  • VanHonk schrieb:

    - n sei nicht initalisierte lokale variable (habe sie doch aber initailiesiert)

    Hast du nicht. lies(n,a) tut nicht, was du zu denken scheinst. Du benutzt erstens den übergebenen Wert von n garnicht in der Funktion sondern überschreibst ihn, und zweitens speicherst du die Rückgabe von lies(n,a) in zeile 47 nirgendwo. Stattdessen übergibst du den uninitialisierten Wert von n an die lies-Funktion und tust nichts damit.
    Das n in der Funktion und das n in Zeile 47 sind zwei verschiedene Variablen!

    - max sei nicht initaliesiert ....... (auch eigentlich initaliesiert)

    Nö. In Zeile 23 definierst du max, ohne einen Wert zuzuweisen. Danach in der if-Abfrage vergleichst du mit dem uninitialisierten max.

    Einige Dinge noch:
    - <stdlib.h> ist kein C++, nutze stattdessen <cstdlib>
    - getch() und system("cls") sind nicht portabel, da gibts bessere alternativen.
    - Das alles sieht etwas zusammengeschnibbelt aus, scheinbar scheinst du nicht genau zu wissen, was du da zusammenkopiert (und vllt. etwas modifiziert) hast. Fang am besten mit den Basics an und arbeite dich langsam hoch, auch wenns mühsam ist.



  • Übrigens, die Deklaration von Variablen am Anfang des Scopes muss gemacht werden, wenn man einen (nicht C99-fähigen)-C-Compiler verwendet.
    In C++ solltest du dir angewöhnen, Variablen so spät wie möglich zu deklarieren und diese gleich initialisieren.



  • Danke erst einmal für die Antworten, haben mich ein ganz wenig weitergebracht 🙂

    yahendrik schrieb:

    Ach ja, warum setzt du in Zeile 13 den übergebenen Parameter auf 0, was für einen Sinn macht dann dieser?

    Damit beim cout<<1+n<< richtige gezählt bzw. dargestellt wird.

    Habe nun der Variablen max einen Wert zugewiesen, war auch doof in der for schleife etwas zu vergleichen das keinen Wert besitzt. Code nun wie folgt:

    double max= 0;
    	for(i=0;i<=nmax;i++){
    		if (d[i]>max)
    			max = d[i];
    						}
    	return max;
    

    pumuckl schrieb:

    Das n in der Funktion und das n in Zeile 47 sind zwei verschiedene Variablen!

    Gut aus n wurd x, somit ist nun alles initalisiert.

    int main()
    {   char men ;	int x= 0; double a[nmax] ;
    

    Das Programm funktioniert nur leider nicht so wie es soll, ohne Menü hatte ich ein ähnliches Programm ohne Maximum welches tadellos geklappt hat. Muss nochmal über den Quelltext schauen oder jemand gibt mir nen denkanstoß 😉



  • VanHonk schrieb:

    Damit beim cout<<1+n<< richtige gezählt bzw. dargestellt wird.

    Wenn n sowieso immer 0 vor der Schleife sein soll, dann kannst du dir aber den Übergabeparameter sparen. Der hat so einfach keinen Sinn. Eine normale, lokale Variable tut's dann auch.



  • Ich würde mal vermuten, daß er am Ende der Funktion die endgültige Anzahl im Hauptprogramm weiterverwenden will. Wenn das so ist: Stichwort "Referenzen". (aber ich würde ohnehin eher einen std::vector<> verwenden anstelle des blanken Arrays)


Anmelden zum Antworten