C# KonsolenAnwendung, dubioser Fehler? verstehe nicht

Hi!
ich bin auf ein Problem gestoßen, und verstehe es nicht!

using System;

namespace ConsoleAppBauStelle
{
class Program
{
private static bool Q=false;
private static ConsoleKeyInfo go;
static void Main(string[] args)
{
Console.WriteLine(„Willkommen in meinem Programm!“);
Console.WriteLine(„TASTE DRÜCKEN UND WEITER“);
Console.ReadKey();
Console.Clear();

        while (Q != true)
        {
            Console.WriteLine("TrainingsArea");
            Console.WriteLine("");
            Console.WriteLine("Press -1- to enter Readkey check");
            Console.WriteLine(""); Console.WriteLine("Press -Escape- to EXIT");
            Console.WriteLine("");
            go = Console.ReadKey(true);
            //Console.Clear();
            //Console.ReadKey().ToString();
            switch(go.Key.ToString())
            {
                case "D1": select1();
                    break;
                case "Escape": Q = true;
                    break;
            };
            Console.Clear();
        }
        static void select1()
        {
            readKlasse readKlasse = new readKlasse();
        }
    }
}

}


using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleAppBauStelle
{
internal class readKlasse
{
public readKlasse()
{
begin();
}
public void begin()
{
CrossRead();
}
public void readLine() {
Console.Clear();
Console.WriteLine(„ReadLine prüfer!“);
string f= Console.ReadLine();
Console.WriteLine(f);
Console.WriteLine(„TASTE DRÜCKEN“);
Console.ReadKey();
}
public void readKey() {

        Console.Clear();
        Console.WriteLine("ReadKey prüfer!");
        ConsoleKeyInfo f = Console.ReadKey();
        Console.WriteLine(f.Key.ToString());
        Console.WriteLine("TASTE DRÜCKEN");
        Console.ReadKey();
    }
    public void read()
    {
        Console.Clear();
        Console.WriteLine("Read prüfer!");
        string c = Console.Read().ToString();
        
        Console.WriteLine(c);
        Console.WriteLine("TASTE DRÜCKEN");
        Console.ReadKey();
    }
    public void CrossRead() {
        Console.WriteLine("");
        Console.WriteLine("*********");
        Console.WriteLine("*********");
        readLine();
        Console.WriteLine("");
        Console.WriteLine("*********");
        Console.WriteLine("*********");
        readKey();
        Console.WriteLine("");
        Console.WriteLine("*********");
        Console.WriteLine("*********");
        read();
        Console.WriteLine("");
        Console.WriteLine("*********");
        Console.WriteLine("*********");
    }
}

}

ich trainiere für ein Menüsystem in der KonsolenAnwendung!

beim ersten Menüdurchgang, ist alles bestens, aber ab dem 2 mal, werden in der Methode ReadLine die ersten beiden Felder übersprungen, woran liegt das? und wieso tritt das Problem in der Methode Read() nicht auf?

Hallo,

ein paar kleine Worte zum Code vorneweg.

Versuche Englisch und Deutsch im Quelltext nicht zu vermischen. Damit meine ich nicht die Ausgaben, die du machst, sondern solche Sachen wie readKlasse. Wenn du Code liest, dann muss dein Gehirn schon zwei Sprachen interpretieren. Englisch und C#. Eine Dritte dazuzutun macht das meistens eher schwerer als leichter.

Der Construktor sollte auch keine langfristig laufenden Methoden aufrufen, wie in deinem Fall. Bei dir kannst du einfach einfach den Kontruktor komplett weglassen und nach dem Konstruieren mit „new“ einfach deine Methode CrossRead aufrufen. Das ist jetzt in deinem Fall nicht schlimm, aber lieber gleich richtig machen, als später wieder umgewöhnen müssen.

Logik: Wenn du logische Operationen verwendest und die in einem Schleifenkopf oder in einem „if“ abfragst, dann solltest du immer schauen, dass du so wenig verrenkungen (negierung, negativ/positiv vertauschen) wie möglich verwenden soltest.

statt:

 bool Q = false;
 while (Q != true) ...

ist ein:

 bool Q = true:
 while(Q) ...

viel einfacher zu erfassen, besonders, wenn die Bedingungen mal etwas komplizierter werden. (der Name Q ist zusätzlich auch nicht besonders klug gewählt.)

Das eigentliche Problem ist erst mal das Console.Read(). Es macht nicht ganz dass was du erwartest.
Es wartet auf ein Enter wie Readline, gibt aber nur das erste Zeichen zurück. Der Rest verbleibt im Input Buffer und das nächste Readline liest dann den Rest. Tausche mal die Aufrufe von Read und Readline, dann hast du das Verhalten gleich beim ersten Durchlauf.

1 Like

Wenn ich ehrlich bin, hab ich keinen Bock das oben zu lesen, weil es so ein Drucheinander ist die Quelle (bin ja ein Leser und kein Interpreter / Compiler… :slight_smile: )- kann auch an der Seite hier www liegen!? Willst du uns den Quelltext nicht durch ein github Repo … zeigen? Das machts einfacher und schneller durchzublicken!

Vorsicht mit readline / readKey… in der Console, das reagiert auf jedem OS anders!
Wenn du es in Windows so hast, dass es dir gefällt, spackt es garantiert in Linux,
hab auch glaub ich so ein Thema gehabt und bringe es vllt. mal in den Weihnachtsferien hier.

Und normal nimmt man das eher mit einer while Schleife auf
while (readKey != möchteSchlussMachen) do anything…
Das wird auch bei dir der Unterschied zwischen erstem und zweitem Mal machen.
Googel mal dazu - es gibt viel…

1 Like

Das geht hier auch ganz gut - wenn man weiß, wie.

Alles, was (mehr wie) vier Leerzeichen eingerückt ist, wird als Code dargestellt. Man kann es aber auch erzwingen:

[code]
using System;

namespace ConsoleAppBauStelle
{
class Program
{
private static bool Q=false;
[/code]

wird zu

using System;

namespace ConsoleAppBauStelle
{
class Program
{
private static bool Q=false;
3 Like

Hi! Ja, ich bin noch nicht gut im coden, übe aber weiter. Der Vorteil in diesem Fall ist, dass es einfach ist, meine Problem Zone darzustellen.

Ich schnüffele die ganze Zeit am gleichen Problem. Es solange anders zu versuchen bis der Code es so macht, wie ich es mir vorstelle, ist das eine, aber ich würde gerne wissen um zu verstehen, warum es nicht funktioniert.

hier wieder neuer Code, mit den gleichen Problemen.–> nach dem break des switches im Titelbild kommen dubiose buchstaben raus.

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleAppBauStelle
{
internal class TitelBild
{
private ConsoleKeyInfo ck;
public TitelBild()
{

        optTions();
    }

    private void optTions()
    {
    while (ck.Key.ToString() != "Escape")
    {
        Console.Clear();
        Console.WriteLine("Press -1- to read mode!");
        Console.WriteLine("2");
        Console.WriteLine("3");
        Console.WriteLine("4"); Console.WriteLine(234);
        ck = Console.ReadKey();
        switch (ck.Key.ToString())
        {
            case "D1":
                readKlasse rk = new readKlasse(); Console.WriteLine("noasdhiashduahiua");//Console.ReadKey();
                break;
        }
    }

    }
}

}
using System;

namespace ConsoleAppBauStelle
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(„Wkvl gestartet“);
Console.Beep();
Console.ReadKey();
TitelBild tb=new TitelBild();
Console.WriteLine(„ByeBye!“);
}
}
}
using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleAppBauStelle
{
class readKlasse
{
private ConsoleKeyInfo ck;
public readKlasse()
{
while (ck.Key != ConsoleKey.Escape)
{
begin();
}

    }
    public void begin()
    {
        Console.Clear();
        choices();
        ck = Console.ReadKey();
       // switch (ck.Key.ToString()) {case "D1": break;}
    }


    public static void choices()
    {
        Console.WriteLine("press 1 for readline");
        Console.WriteLine("press 2 for readline");
        Console.WriteLine("press 3 for readline");
        Console.WriteLine("press 4 for readline");
        Console.WriteLine("press Esc to Exit");
    }
}

}

ich würde das so gerne abschließen.

ich habe keine Ahnung, warum der code hier so komisch dargestellt wird, sorry… :frowning:

das hätte kommen müssen,
Screenshot 2022-12-27 035147
aber es erscheint sowas Screenshot 2022-12-27 035109

Tamara - ich hoffe dir mit dieser Antwort vermitteln zu können, dass du wahrscheinlich die beste Antwort auf deine Fragen geben kannst. :slight_smile:

Entdecke grad dass ich ein totaler Newby in C# bin.
Wie ist dafür eine Dateierweiterung .cs?
In welcher IDE arbeitest du Visual Code?
Ich kriege dein Programm leider noch nicht zum Laufen in Linux sehe aber schon im Syntax Highlighting dass du bei der Ausgabe <<234>> wohl ein paar Anführungsstriche vergessen hast. Ich meine er sucht dann nach einer Varriablen, die 234 heisst…
Glaub aber nicht, dass das das große Problem ist.

Du solltest versuchen, dir im Debugger in deiner IDE die while Schleife genau anzuschauen, was dort passiert in jeder Zeile, was für Werte in den Variablen sind, dann kommst du am besten dahinter was hier läuft und was schief läuft.

Es wird m.E. auf die Schnelle hier niemand darin so gut sein wie du. :slight_smile:
Wir sind auch kein Coder Forum - eher Hobby Coder… :slight_smile:

Die 2 Ausgaben haben auch viel gemeinsam zB die Zeichenanzahl… :slight_smile:

Bist du dir sicher, dass dies dein komplettes Programm ist? Bei mir funktioniert das Anstandslos und ich kann auch nichts erkennen, was dieses Verhalten auslösen könnte.

Probiere doch mal dein Programm nicht über die IDE zu starten sondern direkt aus dem Explorer heraus. Verhält es sich dann genau so?

Grüße

Ihr könnt den Code nicht laufen lassen? Das ist nicht das Programm. Es geht eher nur um genau den einen Abschnitt, wo es strange wird. Ja, ich habe es gedebuggt, aber ich kapier das nicht, alles läuft wie geplant, dann kommt ein eigenartiges Verhalten… Bei mir läuft die Menüführung… bis auf die eine stelle nach dem switch case …nach break…in der klasse Titelbild. Vlt ist ja meine CPU defekt, sollte ich diese austauschen?

Also - was da passiert ist, dass bei der Ausgabe bei jedem Zeichen das höchste Bit gesetzt wird, deswegen verrutschen alle Zeichen in der ANSI-Tabelle um 128 Positionen.
Das liegt wohl kaum an der CPU.
Was der Grund ist, kann ich dir nicht sagen. Irgendeine Compiler/Interpreter-Konfiguration vielleicht.

Hilft das?

Vlt ein verborgener pin oder so. Oder defekter transistor in der CPU??

Ist gut zu wissen, dass es sich um eine Verschiebung in der ANSI Tabelle handelt. Aber der code sollte sowas nicht machen… Nach dem break… Ist …alles…schief.

Ich nutze windows11, vs2019… Pc

Meinst du das hilft? So was ist doch selten notwendig :frowning: einfach nur PC, windows11, und visualstudios… Noch mehr standard geht nicht :smiley:

CPU i7 …3.gen. …vlt der Prozessor zu langsam?

Nee das ist nix mit der CPU, du siehst ja schon die Zeichen, ist nur vertauscht - sprich ein falscher Zeichensatz in Verwendung. Hattest du die Ausgabe schon mal richtig gesehen irgendwann?

Dann würde gar nichts mehr funktionieren.
Eher eine Einstellung der Programmierumgebung - Zeichenkettenkonstanten sollen als „signed char[]“ behandelt werden oder irgend so etwas.

Anfangs läufts ja wie erwartet… Danach, nach dem break in switchCase… Ist alles verschoben. Vlt ist ja das, dass Problem in den Raketen fails gewesen. Oder ram-speicher?

Das break selbst kann es nicht sein (RAM natürlich auch nicht).
Schau mal wo Ausgaben noch funzen und wo nicht mehr, dazwischen muss eine Umschaltung der Codepages erfolgen ohne dass du das beabsichtigst.

Vlllt. ist es wirklich die Variable 234?
Dadurch dass du sie nicht initialisiert hast, kann da Schrott ausgegeben werden, weil er irgendwas druckt was nicht druckbar ist…

234 variable habe ich entfernt… immernoch gleicher Fehler…
Naja, manchmal ist es halt zu kompliziert :smiley: danke euch nochmal.