C# Verwendung der nicht zugewiesenen lokalen Variablen

MissFussel

Newbie
Registriert
Juni 2015
Beiträge
7
Hallo,
ich bin noch Anfänger fürs Programmieren und ich schreib grad ein Programm um den relativen Deckungsbeitrag auszugeben, jedenfalls kommt bei mir die oben stehende fehlermeldung es geht um die Variable wpm 1,2,3, dabei hab ich die Variable ja deklariert und soweit ich weiß ist es doch wenn ich nichts dazu gebe automatisch null....
ich will damit dann rechnen, und jetzt weiß ich nicht mehr weiter

ich hab mal das gesamte Programm unten eingefügt und die Stellen die, dass Programm als Fehler ausweißt unterstrichen und fett gemacht...




namespace relativer_Deckungsbeitrag
{
public partial class Form1 : Form
{

public Form1()
{
InitializeComponent();
}

private void btnBerechnen_Click(object sender, EventArgs e)
{

//Variablen deklarieren
double Adb1, Adb2, Adb3;
double Rdb1, Rdb2, Rdb3;
double Rest1, Rest2;
double wpm1;
double wpm2;
double wpm3;


//Variablen initialisieren
double Maxpz = Convert.ToDouble(txtMaxpz.Text);
double Nvkp1 = Convert.ToDouble(txtNvkp1.Text);
double Nvkp2 = Convert.ToDouble(txtNvkp2.Text);
double Nvkp3 = Convert.ToDouble(txtNvkp3.Text);
double vk1 = Convert.ToDouble(txtVk1.Text);
double vk2 = Convert.ToDouble(txtVk2.Text);
double vk3 = Convert.ToDouble(txtVk3.Text);
double pz1 = Convert.ToDouble(txtPz1.Text);
double pz2 = Convert.ToDouble(txtPz2.Text);
double pz3 = Convert.ToDouble(txtPz3.Text);
double pm1 = Convert.ToDouble(txtPm1.Text);
double pm2 = Convert.ToDouble(txtPm2.Text);
double pm3 = Convert.ToDouble(txtPm3.Text);


//relativer Deckungsbeitrag berechnen

Adb1 = Nvkp1 - vk1;
Rdb1 = Adb1 / pz1;

Adb2 = Nvkp2 - vk2;
Rdb2 = Adb2 / pz2;

Adb3 = Nvkp3 - vk3;
Rdb3 = Adb3 / pz3;


if (Rdb1 > 0 && Rdb2 > 0 && Rdb3 > 0)
{

//Welches Produkt auf welcher Position

if (Rdb1 > Rdb2)
{
if (Rdb1 > Rdb3)
{
lblP1.Text = "1: Produkt 1: " + Rdb1 + " €";

if (Rdb2 > Rdb3)
{

lblP2.Text = "2. Produkt 2: " + Rdb2 + " €";
lblP3.Text = "3. Produkt 3: " + Rdb3 + " €";

if (Maxpz >= pm1 * pz1)
{
txtAnzeige.Text = "1. " + pm1 + " Stück";
Rest1 = Maxpz - pm1 * pz1;

if (Rest1 >= pz2 * pm2)
{
txtAnzeige.Text = Environment.NewLine +
"2. " + pm2 + " Stück";
Rest2 = Rest1 - pm2 * pz2;

if (Rest2 >= pm3 * pz3)
{
txtAnzeige.Text = "Es kann von jedem Produkt die maximale Produktionsmenge produziert werden!";
}
else
wpm3 = Rest2 / pz3;
txtAnzeige.Text = "1. " + pm1 + " Stück"
+ Environment.NewLine + "2. " + pm2 + "Stück"
+ Environment.NewLine + "3. "
+ wpm3 + " Stück";
}
else

wpm2 = Rest1 / pz1;
txtAnzeige.Text = "1. " + pm1 + " Stück"
+ Environment.NewLine + "2. " + wpm2 + " Stück";

}
else
wpm1 = Maxpz / pz1;
txtAnzeige.Text = "1. " + wpm1;

}
else
lblP2.Text = "2. Produkt 3: " + Rdb3 + " €";
lblP3.Text = "3. Produkt 2: " + Rdb2 + " €";
}
else
lblP1.Text = "1. Produkt 3: " + Rdb3 + " €";
lblP2.Text = "2. Produkt 1: " + Rdb1 + " €";
lblP3.Text = "3. Produkt 2: " + Rdb2 + " €";
}
else
{
if (Rdb2 > Rdb3)
{
lblP1.Text = "1. Produkt 2: " + Rdb2 + " €";
lblP2.Text = "2. Produkt 1: " + Rdb1 + " €";
lblP3.Text = "3. Produkt 3: " + Rdb3 + " €";
}

else
lblP1.Text = "1. Produkt 3: " + Rdb3 + " €";
lblP2.Text = "2. Produkt 2: " + Rdb2 + " €";
lblP3.Text = "3. Produkt 1: " + Rdb1 + " €";
}
 
Kann es sein, dass da nach dem "else" jeweils eine {-Klammer fehlt? So, wie du es kopiert hast, ist es:

Code:
if (Rest2 >= pm3 * pz3)
{
        txtAnzeige.Text = "Es kann von jedem Produkt die maximale Produktionsmenge produziert werden!";
}
else
        wpm3 = Rest2 / pz3;
// das nächste wird unabhängig vom if..else immer ausgeführt
// das heißt, wenn die if-Bedingung wahr war, hat wpm3 hier keinen Wert zugewiesen bekommen
txtAnzeige.Text = "1. " + pm1 + " Stück"
+ Environment.NewLine + "2. " + pm2 + "Stück"
+ Environment.NewLine + "3. "
+ wpm3 + " Stück";

Edit: Und benutz bitte den [ code ]... [ /code ] - BBcode für Quelltext, das vereinfacht das Lesen.
 
Man sollte Variablen nach Möglichkeit gleich beim Deklarieren auch Initialisieren, um einfach ggf Problemen aus dem Weg zu gehen...

Bin mir nicht 100% sicher, aber ich glaube es gab auch schon Fälle da war der Wert nach der deklaration eben nicht 0. Deswegen lieber selber nochmal zur Sicherheit mit 0 initialisieren
 
Zuletzt bearbeitet:
okay, danke ich habs jetzt hintendran geschieben, dass es 0 sein soll und dann hat es funktioniert

Danke :)
 
Brauchst du die Variablen überhaupt? Du benuzt die ja nur einmal.
Statt z.b.:
Code:
else
wpm1 = Maxpz / pz1;
txtAnzeige.Text = "1. " + wpm1;
Kannst du ja auch (bin ich mir unsicher da ich lieber Funktionsklammern mach sonst passiert mir noch der Fehler(?) wie dir oben, siehe Post #2)
Code:
else
txtAnzeige.Text = "1. " + (Maxpz / pz1);
oder im Langformat
Code:
else {
txtAnzeige.Text = "1. " + (Maxpz / pz1).ToString(); 
}
schreiben
 
Zuletzt bearbeitet:
Zur Info sei noch gesagt das der Wert Null nicht gleich 0 ist. https://de.wikipedia.org/wiki/Null#Bedeutung_in_der_Informatik
Null bedeutet das einer Variable kein Wert zugewiesen wurde. Mit einer Variable die den Wert Null enthält kannst du nicht Rechnen.
0 bedeutet das die Variable den Wert Null enthält. Mit dieser Variable kannst du Rechnen.

Auch würde ich es an deiner Stelle so machen wie Theobald93 es geschrieben hat. Wenn du eine Variable nur einmal benötigst ist sie unnötig, erst wenn du das Ergebnis einer Berechnung ein zweites Mal benötigst würde ich eine Variable deklarieren.
 
Zuletzt bearbeitet:
LukS schrieb:
Auch würde ich es an deiner Stelle so machen wie Theobald93 es geschrieben hat. Wenn du eine Variable nur einmal benötigst ist sie unnötig, erst wenn du das Ergebnis einer Berechnung ein zweites Mal benötigst würde ich eine Variable deklarieren.

Dem würde ich nicht unbedingt zustimmen.
Nämlich dann wenn der Wert später dynamisch sein soll und bspw über den Konstruktor gesetzt wird.
Variablen sind nicht nur dafür gedacht sie mehrfach nutzen zu können. Man hat ständig Variablen die nur einmal benutzt werden.
 
Ok WhiteShark, in dem Punkt muss ich dir recht geben. Aber sonst finde ich es recht sinnlos eine eigene Variable nur für einen einmaligen Arbeitsschritt zu erstellen.
Bsp.: c = q+w
a = b * c
Wenn ich das Zwischenergebnis c nie wieder brauche, dann ist es doch einfacher, wenn man es gleich so mache: a = b * (q+w)
Oder täusche ich mich da?
 
Das ist richtig. Man muss immer abwägen wo es Sinn macht eine Variable zu setzen.
Bspw ein
c = a + b;
return c;

macht wenig Sinn, da ist return a + b; sinnvoller. Außer man plant c später nochmals irgendwo zu verwenden.
 
Vielleicht sollte man erwähnen warum der Fehler so ausgegeben wird.
Die Logik dahinter ist, dass deine Variablen, so ziemlich alle wenn ich richtig sehe, durch Text-felder gefüttert werden. Wenn jetzt aber ein Textfeld leer ist, ist auch der Wert der Variable leer und schon kann damit nicht mehr gerechnet werden.

ich mache es immer so dass ich in der Variablendeklaration bereits Zahlenwerte = 0 setze. Also z.B. "double test = 0;" Erst im zweiten Schritt folgt dann die Zuweisung eines Wertes z.B: aus einem Textfeld. Wenn das Textfeld dann leer ist, bleibt die 0 als Variable erhalten. Damit kann man diesen Fehler vermeiden, bei einer leren EIngabe wird dann aber unter umständen nicht korrekt gerechnet, das muss man natürlich beachten..
 
Zurück
Oben