Probleme mit Variablen innerhalb einer Switch-Anweisung

Tex_Murphy

Mitglied
Hallo, ich bin Umsteiger von VB 5 und C' - Anfänger.
Ich habe folgendes Problem: Ich lese eine Textdatei aus und überprüfe das erste Zeichen in der Zeile. Abhängig von diesem Zeichen sollen aus der Zeile unterschiedliche Werte in unterschiedliche Variablen eingelesen werden.
Die Variablen werden korrekt ausgelesen, das habe ich getestet. Leider geht der Wert der Variablen anscheinend verloren, sobald ich eine neue Zeile einlese (der Wert wird nicht überschrieben, er ist einfach nicht mehr da)

C#:
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));
             ih = Convert.ToDouble (zeile.Substring(88,8))/1000;
             rh = Convert.ToDouble (zeile.Substring(72,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(40,8))/100000;
      ss = Convert.ToDouble (zeile.Substring(56,8))/1000;
      // die nächste Zeile war rot markiert :)
      gesamttext += stpkt.ToString()+" " + ih.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;
In der Zeile 22 bekomme ich für stpkt und ih einen "Use of unassigned local variable" - Fehler.

Wie kriege ich die Werte der Variablen erhalten?

PS: Danke für die Hilfe bei der Darstellung.
 
Zuletzt bearbeitet:
Guten Morgen!

WTF? Nachdem Du jetzt das Codetag verwendet hast,
hab ich jetzt nur 1 Min gebaucht um den Code zu verstehen. :p
Gestern hab ich nur Spagatties gesehen. :D

stpkt wird in case 2: verarbeitet,
jedoch nur in case 8: gespeichert.
Wenn ich den Code richtig verstehe,
muss sich vor jeder Messzeile eine Startzeile befinden.
Ist es denn auch so?
Andere Frage: Was machst da eigentlich genau?
Ich mein Text-Dateien zum speichern von Daten herzunehmen,
kann unter Umständen mehr Overhead Produzieren als eigentlich gewollt war.
XML ansich oder Serialisierung währ hier die absolut optimale Alternative.

Btw kannst auch so schreiben
Code:
while ( (zeile = datei.ReadLine()) != null )
MfG
cosmo
 
Hui... was mache ich da eigentlich... Ich versuche mal, es zu erklären.
Ich habe folgende Textdatei (Auszug:)

110001+00000010 84..10+00000000 85..10+00000000 86..10+00000000 87..10+00001330 88..10+00001600
410006+00000002
110007+00000011 21.322+10876325 22.322+09813975 31..00+00124966 51..1.+0000+000 87..10+00001330 88..10+00001600
410009+00000022
110010+0010.002 21.322+10943150 22.322+09814650 31..00+00124621 51..1.+0000+000 87..10+00001330 88..10+00001600
110012+0010.003 21.322+10844000 22.322+09813650 31..00+00124943 51..1.+0000+000 87..10+00001330 88..10+00001600
410013+00000015
110014+0010.004 21.322+10830000 22.322+09814400 31..00+00124911 51..1.+0000+000 87..10+00001330 88..10+00001600

Dies ist ein exemplarischer Block. In einer normalen, auszulesenden Datei befinden sich mehrere solcher Blöcke (und längere)
Und möchte das ganze so ausgelesen und umgefrickelt haben, daß Zeilen entstehen, in denen die oben grün, türkis und rot markierten Werte auftauchen. Das sollte dann so aussehen:

10 1660 1330 2 11
10876325 09813975 124966
10 1660 1330 22 10.002 10943150 09814650 124621
10 1660 1330 22 10.003 10844000 09813650 124943
10 1660 1330 15 10.004 10830000 09814400 124911

Wie Du siehst, ändern sich die in der ersten Zeile eingelesenen Werten (grün) nichts. Das würde sich erst wieder beim nächsten Block ändern. Die blauen Werte ändern sich manchmal, die roten jedesmal.

Meine gedachte Vorgehensweise: Ich überprüfe zunächst die Art der Zeile: Ist es eine blaue Zeile (Codezeile, beginnt mit einer "4") oder eine rot/grüne Zeile (beginnt mit einer 1). Im Falle einer rot/grün-Zeile wird dann in der zweiten switch-Anweisung word dann überprüft, ob das 17. Zeichen eine 8 ist (grüne Startzeile) oder eine 2 (rote Messzeile).

Ich hoffe, es ist einigermassen verständlich geworden:rolleyes:

Bleiben mir nur zwei Fragen:
1. Wie kriege ich den Wert von z.B. stpkt von case 8 in case 2 übertragen
2. Wieso wird - wenn ich in case 8 die Werte in gesamttext eintrage das dort eingetragene gespeichert, die Ursprungswerte von stpkt aber nicht?

Vielen Dank für die Hilfe:)
 
  • Wenn case 8 vor case 2 verarbeitet wird.
  • Die Frage versteh ich nicht :-(
    Debugge des Spaß doch mal. Setz einen Breakpoint in der Zeile
C#:
ausgabe = Convert.ToInt32(zeile.Substring(0,1));
und wandere mit F10 (Einzelschritt) durch die Routine.
Ich würd dir jetzt echt gern bei der Routine helfen,
nur hab ich heut noch was anderes um die Ohren.
Du machst aber bei weitem nicht den Anschein,
dass Du dafür noch groß Hilfe brauchst.
Du musst nur die Eventualitäten behandeln

Und mach Dir mal Gedanken ob Du nicht mit Regex besser vom Fleck kommst,
oder gar das Format der hier vorliegenden Ausgangsdaten,
eine komfortable Verarbeitung erschwert und vielleicht zu ändern ist.MfG,
cosmo
 
Aber case 8 wird doch vor case 2 verarbeitet. Schließlich kommt zuerst die Startzeile... ach was, ich probier jetzt mal das mit den Einzelschritten, dann sehe ich weiter. Erst mal viiiielen Dank!

Ich seh' schon, ich gehe wieder zu VB 5 zurück. Da ist das alles viel einfacher *seufz*
 
Zuletzt bearbeitet:
Tex_Murphy hat gesagt.:
Ich seh' schon, ich gehe wieder zu VB 5 zurück. Da ist das alles viel einfacher *seufz*
Komm schon, das währe für mich schwieriger.
Immerhin hast hier ein viel mächtigeres Framework hinter.
Du kommst viel schneller vom Fleck wenn Du dich erstmal auskennst. :)
Evtl kann ich Dir Montag richtig weiterhelfen.
Wenn ich zeit hab versuch ichs mal selber einzulesen und poste den Code...

MfG,
cosmo
 
Ich hab das Ganze jetzt mal so knapp im Kopf durchgemacht, und auch die Zeichen gezählt.
1. Ich hoffe wenn du schreibst 84...10 etc steht das ... für Platzhalter, denn wenn es so in der Txt steht, liest du schonmal ganz falsche Zahlen aus :)
2. Für denn Fall, dass du in deinem zweiten Switch, eine zahl von 8 hast, weist du deine ausgewerteten Zahlen ja nirgends zu, du liest das schön aus, aber diese Zeile
C#:
gesamttext += stpkt.ToString()+" " + ih.ToString()+" " + hz.ToString()+" " + vz.ToString() +" "+ ss.ToString() +" "+"\r" + "\n";
Fehlt bei dir. Sprich, wenn deine Ausgabe2 ne 8 ist, kommst du doch gar nicht in den Case:2 rein, und wenn du die Daten vom Case:8 beibehalten willst, musst diese ausgelesen Werte, auch einer globalen Variabel übergeben und diese Variablen in deiner Case:2 Ausgabe(die von oben) nehmen. Hmm, irgend wie kommt jetzt aber wieder Verwirrung in mir auf, muss schauen ob ich am Nachmittag Zeit habe, das Programm zu testen, und nicht nur im Kopf :)

Bis denne
ziop
PS: Ich hoffe du schnallst, was ich so knapp sagen will :) Du brauchst ja in Case:2 Werte, die du in Case:8 rausliest, jedoch kommst du in Case:2 nicht im selben Durchlauf rein, also verlierst du die Werte, deshalb müsstest du diese Werte global abspeichern...
 
Soll ich Dir die Textdatei und den Code irgendwie zumailen? Ich bekomme nämlich immer noch einen D:\Tom\NarfII\Narf II\Form1.cs(269): Use of unassigned local variable 'stpkt'
Fehler, obwohl bei der Einzelschrittauswertung der Variablen stpkt der korrekte Wert zugewiesen wurde.
Und unassigned heisst ja nix anderes als unbestimmt, was auf einen Deklarationsfehler hinweist. Ich habe aber stpkt, ih und rh genau wie die anderen Werte als double deklariert, daran dürfte es nicht liegen.

Ist wahrscheinlich ein ganz blöder Fehler, irgendeine Kleinigkeit übersehen. Aber das frustriert irgendwie.

Aber jetzt lasse ich Dich in Ruhe, geniesse Dein Wochenende, ich werde mit ein paar Kollegen eine kleine LAN veranstalten und meinen Ärger abbauen^^

Danke,
Tom
 
zioProduct hat gesagt.:
Ich hab das Ganze jetzt mal so knapp im Kopf durchgemacht, und auch die Zeichen gezählt.
1. Ich hoffe wenn du schreibst 84...10 etc steht das ... für Platzhalter, denn wenn es so in der Txt steht, liest du schonmal ganz falsche Zahlen aus :)

Nein, die Zahlen stimmen so, das sehe ich in der Einzelschrittauswertung, das ist auch alles korrekt so.

zioProduct hat gesagt.:
2. Für denn Fall, dass du in deinem zweiten Switch, eine zahl von 8 hast, weist du deine ausgewerteten Zahlen ja nirgends zu, du liest das schön aus, aber diese Zeile

Code:
gesamttext += stpkt.ToString()+" " + ih.ToString()+" " + hz.ToString()+" " + vz.ToString() +" "+ ss.ToString() +" "+"\r" + "\n";

Fehlt bei dir. Sprich, wenn deine Ausgabe2 ne 8 ist, kommst du doch gar nicht in den Case:2 rein, und wenn du die Daten vom Case:8 beibehalten willst, musst diese ausgelesen Werte, auch einer globalen Variabel übergeben und diese Variablen in deiner Case:2 Ausgabe(die von oben) nehmen. Hmm, irgend wie kommt jetzt aber wieder Verwirrung in mir auf, muss schauen ob ich am Nachmittag Zeit habe, das Programm zu testen, und nicht nur im Kopf :)

Aber ich dachte, C# hätte keine globalen Variablen:confused: Wie dem auch sei: Ich habe den Code per Einzelschrittverfahren durchlaufen lassen, und mir dabei ständig die Variablenwerte anzeigen lassen. Alles ist korrekt. Nur, wenn ich das Programm starten möchte, bekomme ich gleich diesen unassigned - Fehler. Läuft das Programm, sind - wenn ich an die "fehlerhafte" Zeile komme, die Werte für stpkt, ih und rh noch immer korrekt im Speicher.
Ich versteh's nicht.
Und der Fall, daß jemals eine case 2 vor einer case 8 auftritt, kann nicht eintreffen, das jede einzulesende Textdatei mit der Startzeile beginnt.
Bis denne
ziop
PS: Ich hoffe du schnallst, was ich so knapp sagen will :) Du brauchst ja in Case:2 Werte, die du in Case:8 rausliest, jedoch kommst du in Case:2 nicht im selben Durchlauf rein, also verlierst du die Werte, deshalb müsstest du diese Werte global abspeichern...

Ja, das habe ich soweit verstanden. Was ich nicht verstehe:
  1. Die Werte der Variablen werden bei der Überprüfung im Einzelschrittverfahren auch bei späteren Durchläufen noch korrekt angezeigt. Wieso, wenn sie doch ihren Wert beim nächsten Durchlauf verlieren?
  2. Wenn Variablen ihren Wert beim nächsten Durchlauf verlieren, weil sie keine globalen Variablen sind - wieos behält dann die Stringvariable gesamttext durch sämtliche Durchläufe bei?
Jetzt bin ich richtig verwirrt...
 
compiler hat gesagt.:
D:\Tom\NarfII\Narf II\Form1.cs(269): Use of unassigned local variable 'stpkt'
Ähm, das heisst das Du auf eine uninitalisierte Variable zugreifst.
Du initialisierst stpkt aber wenigstens mit string.Empty?
Und häng mal das Beispiel Projekt an. Dieses Rätzelraten nervt. :D
 

Neue Beiträge

Zurück