Probleme mit Variablen innerhalb einer Switch-Anweisung

cosmochaosmaker hat gesagt.:
Du initialisierst stpkt aber wenigstens mit string.Empty?
Ahem.. nein. Muss ich das? Ich meine, eigentlich ist doch stpkt ein Zahlenwert, den ich lediglich - da ich ihn in einer TextBox ausgebe, als string ausgeben muss.
Sorry, wenn ich hier Stümper-Fehler begehe, aber wie gesagt, ich bin Umsteiger... Oh, achja, ich hänge mal den Code an:
C#:
private void button3_Click(object sender, System.EventArgs e)
        {
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                string zeile;
                string gesamttext = " ";
                int ausgabe;
                int ausgabe2;
                double stpkt;
                double pnr;
                int code;
                double ih;
                double rh;    
                double hz;
                double vz;
                double ss;
                
                StreamReader datei = new StreamReader(openFileDialog1.FileName);
                zeile = (datei.ReadLine()); // einzelne Zeile einlesen
                
                while (zeile != null)
                {
                    ausgabe = Convert.ToInt32(zeile.Substring(0,1));
                    //gesamttext += ausgabe.ToString() + "\r" + "\n";
                    switch (ausgabe)
                    {
                        case 1: 
                             // Zeile ist eine Start- oder Messzeile
                             ausgabe2 = Convert.ToInt32(zeile.Substring(16,1));
                        
                        switch (ausgabe2)
                        {
                            case 8:
                                //Zeile ist Startzeile
                                stpkt = Convert.ToDouble (zeile.Substring(8,8));
                                rh = Convert.ToDouble (zeile.Substring(72,8))/1000;
                                ih = Convert.ToDouble (zeile.Substring(88,8))/1000;
                            break;
                            case 2:
                                // Zeile ist Messzeile
                                pnr =Convert.ToDouble (zeile.Substring(8,8));
                                hz = Convert.ToDouble (zeile.Substring(23,8))/100000;
                                vz = Convert.ToDouble (zeile.Substring(39,8))/100000;
                                ss = Convert.ToDouble (zeile.Substring(56,8))/1000;
                                gesamttext +=  stpkt.ToString()+"  " + ih.ToString()+"  " + rh.ToString()+"  " + hz.ToString()+"  " + vz.ToString() +"  "+ ss.ToString() +"  "+"\r" + "\n";
                            break;
                        }
                            break;
                        case 4: 
                            //Zeile ist Codezeile
                            code = Convert.ToInt32 (zeile.Substring(8,8));
                        break;
                    }
                    zeile = (datei.ReadLine()); // einzelne Zeile einlesen
                }
                datei.Close();
                textBox1.Text = gesamttext;
            }
        }
    }
}
 
Zuletzt bearbeitet:
Guten Morgen!
Tex_Murphy hat gesagt.:
Ahem.. nein. Muss ich das? Ich meine, eigentlich ist doch stpkt ein Zahlenwert, den ich lediglich - da ich ihn in einer TextBox ausgebe, als string ausgeben muss.
Ähm, sorry. Mein Fehler. :-( Ich meint wenigstens mit 0.
Du kannst nur auf ininitalisierte Variablen zugreifen...
D.h. wenn Du den Fehler bekommst, wird case 8 NICHT vor case 2 verarbeitet. ;)

Wenn ich heut Zeit finde, schau ich mir das mal genau an.
Im Moment hab ich noch viel um die Ohren.
 
Doch, wird er. Das ist ja das Merkwürdige. Wenn ich nämlich stpkt, ih und rh innerhalb des case 8: Blocks anstelle innerhallb des case 2:als strings ausgeben lasse, dann wird das korrekt ausgegeben, und zwar als erste Zeile, vor jeglicher case2 Auslesung.

C#:
switch (ausgabe2)
	{
		case 8:
		    //Zeile ist Startzeile
			stpkt = Convert.ToDouble (zeile.Substring(8,8));
			rh = Convert.ToDouble (zeile.Substring(72,8))/1000;
			ih = Convert.ToDouble (zeile.Substring(88,8))/1000;
			gesamttext +=  stpkt.ToString()+"  " + ih.ToString()+"  " + rh.ToString()+"\r" + "\n";	     break;
		case 2:
			// Zeile ist Messzeile
			pnr =Convert.ToDouble (zeile.Substring(8,8));
			hz = Convert.ToDouble (zeile.Substring(23,8))/100000;
			vz = Convert.ToDouble (zeile.Substring(39,8))/100000;
			ss = Convert.ToDouble (zeile.Substring(56,8))/1000;
			gesamttext +=   hz.ToString()+"  " + vz.ToString() +"  "+ ss.ToString() +"  "+"\r" + "\n";								
               break;
		}

Dass sieht mein Ergebnis so aus:
Code:
 10  1,6  1,33
108,76325  98,13975  124,966  
109,4315  98,1465  124,621  
108,44  98,1365  124,943  
108,3  98,144  124,911  
108,267  98,085  124,898  
107,9245  98,115  124,77  
114,8635  98,102  54,821  
114,5125  98,097  54,529  
114,8895  98,102  52,844

Also wird case 8 zuerst verarbeitet, korrekt ausgelesen und richtig angezeigt. Aber ich möchte diese Werte nicht nur einmal als erste Zeile in der Auswertung haben, sondern als Anfang jeder Zeile.
Genau das ist ja mein Problem, sonst würde ich es ja verstehen. Aber wie gesagt, selbst bei Einzelschrittkontrolle läuft das eigentlich korrekt...
 
Zuletzt bearbeitet:
Wen Du es innerhalb von case 8: ausgeben lässt,
ist es auch logisch das es ausgegeben wird, da dort ja die Werte gespeichert werden.
Nur wenn Du aber sagst, dass Du in case 2: einen Zugriffsfehler auf spkt bekommst,
kann das eigentlch nur daran liegen das spkt null ist
und demzufolge auch kein .ToString() aufgerufen werden kann..

Vorschlag:

Debugge jede Iteration und arbeite Dich Zeile für Zeile durch.
So solltest die Stelle im Code oder in dem TextFile finden können,
die den Fehler verursacht...
Also entweder ist das TextFile unregelmäßig oder die Startzeilen-Erkennung haut net hin.

Was mir auffällt ist das Du alles statisch einliest.
Das kannst Dir nur erlauben wenn wirklich alle Werte an der selben Postition sind.
Dessen solltest Dir absolut sicher sein, ansonsten würd ich die Zeilen via Regex idendifizieren.
Was in zudem auch in jedem Fall zuverlässiger währe. ;)
 
cosmochaosmaker hat gesagt.:
Nur wenn Du aber sagst, dass Du in case 2: einen Zugriffsfehler auf spkt bekommst,
kann das eigentlch nur daran liegen das spkt null ist
und demzufolge auch kein .ToString() aufgerufen werden kann..
Isses aber doch nicht. Ich habe doch Einzelschritt durchlaufen lassen. Wenn ich dann an die Ausgabezeile in case2: komme, dann kriege ich ja die Werte der einzelnen Variablen im Local-Fenster angezeigt Und da stehen die korrekten Werte von stpkt drin.

Vorschlag:

Debugge jede Iteration und arbeite Dich Zeile für Zeile durch.
So solltest die Stelle im Code oder in dem TextFile finden können,
die den Fehler verursacht...
Also entweder ist das TextFile unregelmäßig oder die Startzeilen-Erkennung haut net hin.

Was mir auffällt ist das Du alles statisch einliest.
Das kannst Dir nur erlauben wenn wirklich alle Werte an der selben Postition sind.
Dessen solltest Dir absolut sicher sein, ansonsten würd ich die Zeilen via Regex idendifizieren.
Was in zudem auch in jedem Fall zuverlässiger währe. ;)
Okay, ich probiere das mal. Das Textfile ist übrigens absolut regelmässig, es gibt da zwar noch Dinge, die man ändern kann, di aber z:Z nicht geändert werden. Im Moment möchte ich erst mal das Programm mit dem regelmässigen textfile ans Laufen bringen, die flexiblere Variante kommt später.

Mein Vorschlag/Bitte wäre: Ich habe den Code oben gepostet, und poste jetzt mal einen Auszug aus der Textdatei. Probiert doch mal bitte, ob dieser $@§*# Fehler bei Euch auch auftritt. Denn es dürfte nicht daran liegen, daß ich eine englische .net Version habe, oder?
 
Werd heut eher weniger Zeit finden als angenommen.
Du würdest es mir einfach machen Dir bei der Fehlersuche zu helfen,
wenn du mal ein kleines Beispielprojekt samt dem TextFile machst (Console/GUI egal)
und es hier postest.

Denn es dürfte nicht daran liegen, daß ich eine englische .net Version habe, oder?
Nein , sicherlich nicht.
Die Thread.CurrentCulture und die Thread.CurrentUICulture,
sind beim Start der Anwendung immer auf die aktuelle SystemSprache eingestllt.
Wenn Du aber zB englische Gleitkommazahlen einlesen möchtest,
kannst so [thread=187169]Feststellen ob ',' oder '.' als Trennzeichen eingestellt ist? - Thread[/thread]
und ggf. umstellen. :)
 
Öhm, als ich es grad mal auprobiert hab, hat es ohne abzuschmieren funktioniert. :confused:
Ob's jetzt natürlich korrekt ausgelsen wurde kann ich nicht sagen,
da ich es mir grad nicht genauer anschauen kann.

Könntest Du mir nochmal sagen wo genau der Fehler auttritt.
Also ab welcher Zeile in dem TextFile rummst.
Zähl mal sie in 'ner statischen Variable mit und gib Sie mit in dem Catch-Block aus,
den ich in der Main eingefügt hab.
 

Anhänge

Natürlich hat sie funktioniert - weil ich ein Idiot bin. Die Problemvariablen werden nämlich in der Version, die ich hochgeladen habe, im case 2: block garnicht ausgelesen.
Ich hänge das fehlerhafte Projekt nochmal an. Soooorrry
 

Anhänge

Moin!

Hatte gestern keine Zeit mehr, es mir aber grad mal schnell angeschaut.

Um die Einlese-Logik hab ich erstmal nicht gekümmert,
aber ich hab es aber erstmal zum laufen gebracht und den Code im Programm kommentiert.
Wie ich schon gesagt hatte, du vergisst die Variablen mit einem Wert zu initialieren.

Wenn ihr Wert erst in irgend einer Bedingung gespeichert wird,
aber auf jeden Fall verarbeitet wird, _MUSST_ das Objekt mit einem Wert initialisieren. ;)

Wenn dann aber die gewünschten Werte nicht ausgelesen werden,
musst dein Algorithmus oder das DatenFile checken.
Tut mir wirklich sorry :(, hab aber im Moment zu viel um die Ohren.

MfG,
cosmo
 

Anhänge

Zurück