C# Wie Return-Wert in While-Schleife abrufen?

Basinator

Lt. Junior Grade
Registriert
Jan. 2009
Beiträge
270
Hallo!

Ich habe folgendes Problem:
Mein Programm funktioniert, wenn ich im 1. Durchlauf eine Zahl eingebe.
Wenn ich jedoch erst ein ungültiges Zeichen eingebe und danach eine Zahl, erhält meine While-Schleife dennoch kein return 0.

Wie ich gerade festgestellt habe, wird mit while (eanEingabe() == 1) bereits meine Methode aufgerufen. Wie kann ich in der While-Schleife nur auf den Return-Wert prüfen, ohne die damit Methode abzurufen?

Grüße!

Code:
class Program
    {
        static int ean;

        public static int eanEingabe()
        {
                try
            {
                ean = Convert.ToInt32(Console.ReadLine());
                Console.WriteLine(ean);
                return 0;
            }
            catch (Exception formatError)
            {
                Console.WriteLine((formatError.Message));
                Console.Write("Bitte EAN erneut eingeben: ");
                return 1;
            }

        }
        static void Main(string[] args)
        {
            Console.Write("Bitte EAN eingeben: ");

            while (eanEingabe() == 1)
            {
                eanEingabe();
            }

            
        }
    }
 
Lass dir mal Ausgeben, welcher String genau eingelesen wird.

Hatte glaube das gleiche Problem mal in Java, dass irgendetwas noch am Anfang bzw Ende noch etwas aus vorherigen Eingaben eingelesen wurde oder so..
 
Du rufst die Funktion eanEingabe() zweimal auf. direkt beim while-abbruchkriterium und in der schleife. ruf die funktion nur einmal auf und speichere den rückgabewert in einer variable.

btw: nimm bitte für boolsche sachen auch einen boolean datentyp. ich weiß man kann das in c machen. ist aber nicht schön.
 
Zuletzt bearbeitet:
Nimm doch den Methodensaufruf in die While-Schleife.

Code:
int eanReturn;
while (true)
{
    eanReturn = eanEingabe()
    if (eanReturn = 1) 
    {
        break;
    }
}

Alternativ auch als do-while.
 
Wenn du das so machen willst, musst du bei eanEingabe() innerhalb der while-schleife eine Helfervariable verwenden. Also in der main() funktion mit

int retval = eanEingabe();

den ersten Aufruf machen, und dann

while (retval == 1) {
retval = eanEingabe();}

verwenden.
 
Kann ich nicht den Rückgabe-Wert vom letzten Aufruf verwenden/ansteuern?
 
wie meinst du das? versteh ich nicht...
rückgabe werte verwendest du öfters wieder, indem du sie in einer variable speicherst.
 
Meine Frage ist, ob ich Rückgabewerte extra in einer Var speichern muss. Stellt sich nicht dann fast die Frage, ob ich nicht Var STATT Returns verwenden kann/sollte und nicht zusätzlich?
 
Aber zur meiner Ursprungsfrage, kann ich ohne Variable den Return-Wert der vorherigen Ausführung der Funktion prüfen?

Würde dann nicht sogar eine braindead-leere While-Schleife funktionieren?
while (eanEingabe() == 1)
{

}
 
Variablen und Returnwerte ist ja ganz etwas anderes. Keine Ahnung wie du das meinst, dass man das eine statt dem anderen verwenden sollte... Vielleicht verstehe ich dich aber auch falsch.
Ergänzung ()

Basinator schrieb:
Aber zur meiner Ursprungsfrage, kann ich ohne Variable den Return-Wert der vorherigen Ausführung der Funktion prüfen?

Würde dann nicht sogar eine braindead-leere While-Schleife funktionieren?
while (eanEingabe() == 1)
{

}

hmm, könnte vielleicht auch so gehen... Schaut halt schon iwie komisch aus... ;)
 
Zuletzt bearbeitet:
Ich finde es etwas umständlich, den Return-Wert extra in eine Variable zu speichern anstatt ihn direkt zu verwenden.
 
Basinator schrieb:
Aber zur meiner Ursprungsfrage, kann ich ohne Variable den Return-Wert der vorherigen Ausführung der Funktion prüfen?
Da der Rückgabewert der Funktion stets der aktuelle Wert ist, kannst du ohne Variable nicht den Return-Wert der vorherigen Ausführung in Erfahrung bringen.

Diese Variable kannst du entweder als Liste machen, um die Werte aller vorangegangenen Aufrufe zu haben (in C# gibt es Arrays/Listen mit variabler Größe) oder, wenn du nur 1 alten Wert benötigst, als einfache Variable mit dem entsprechenden Typ (Int, Bool).
 
Basinator schrieb:
Ich finde es etwas umständlich, den Return-Wert extra in eine Variable zu speichern anstatt ihn direkt zu verwenden.

naja. bei so mini-programmen mag es umständlich aussehen. aber es geht hier um die lesbarkeit, wartbarkeit und testbarkeit. wenn du mal ein paar tausend zeilen code beisammen hast, willst du wissen welche werte du wo hast und willst außerdem auch breakpoints zum debuggen setzten können.
wenn man es darauf anlegt, könnte man dein ganzes programm auch in einer zeile schreiben. aber sinnvoll ist es halt nicht.
 
Welche Lösungen würdet ihr denn zu meinem Programm alternativ vorschlagen, ohne While-Schleife?
 
irgendeine schleife (oder halt rekursion, aber denke soweit seit ihr noch nicht, bzw ist es hier auch nicht wirklich 100% sinnvoll) brauchst du schon. while oder do-while ist schon ok.
 
Basinator schrieb:
Ich finde es etwas umständlich, den Return-Wert extra in eine Variable zu speichern
Du kannst den letzten Return-Wert auch innerhalb der Methode eanEingabe() speichern und als optionalen Parameter angeben, ob der aktuelle oder letzte Wert übermittelt werden soll. Sauber ist das aber nicht, mit sowas rechnet keiner... Aufgabe einer Funktion ist ihre Berechnung durchzuführen, Aufgabe des Clients (in diesem Falle die Main Methode) ist es, die Ergebnisse dieser Berechnung zu verwenden und dazu zählt auch speichern.
 
Basinator schrieb:
Ich finde es etwas umständlich, den Return-Wert extra in eine Variable zu speichern anstatt ihn direkt zu verwenden.

Natürlich musst du das nicht, z.B.:
Code:
            while (eanEingabe() == 1);

Damit ist die while Schleife einfach leer und wird ausgeführt bis 0 zurückgegeben wird, siehe das Semicolon am Zeilenende was normal nicht so genutzt wird. while (eanEingabe()); ist aber leicht eleganter und sollte bei 0 "false" und "1" true in der Funktion sein.
 
wenn ich mich jetzt nicht irre, könnte es so auch gehen, ohne schleife. Habs aber nicht getestet.

Code:
    class Program
        {     
            private static void CheckInput()
            {
                try
                {
                    Console.WriteLine(Convert.ToInt32(Console.ReadLine()));
                }
                catch (Exception ex)
                {
                    Console.WriteLine((ex.Message));
                    Console.Write("Bitte EAN erneut eingeben: ");
		    CheckInput();
                }
            }

            static void Main(string[] args)
            {
                Console.Write("Bitte EAN eingeben: ");
		CheckInput();
            }
        }

Edit: ok, habs getestet. Funzt. Ist halt mit Rekursion statt Schleife.
 
Zuletzt bearbeitet:
Mit Feedback bei falscher Eingabe, Löschfunktion (Backspace), alles in einer Methode und ohne Exceptions.

Code:
        static void Main(string[] args)
        {
            Console.Write("EAN: ");

            string ean = ReadNumber();

            Console.WriteLine("\nInput: " + ean);
            Console.ReadKey();
        }

        static string ReadNumber()
        {
            string input = string.Empty;
            int startLeft = Console.CursorLeft;

            ConsoleKeyInfo key;
            while ((key = Console.ReadKey(true)).Key != ConsoleKey.Enter)
            {
                int c = key.KeyChar;

                if (c >= 48 && c <= 57) //if is digit
                {
                    Console.Write((char)c);
                    input += (char)c;
                }
                else if (c == (int)ConsoleKey.Backspace)
                {
                    if (input.Length > 0)
                    {
                        input = input.Substring(0, input.Length - 1);
                        Console.CursorLeft = startLeft;
                        Console.Write(input + "  ");
                        Console.CursorLeft-=2;
                    }
                }
                else
                {
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.Write((char)c);
                    Console.ForegroundColor = ConsoleColor.Gray;
                    Console.CursorLeft--;
                }
            }

            return input;
        }
 
Zurück
Oben