Jump to content
Unity Insider Forum
Sign in to follow this  
B##

Unreachable code detected

Recommended Posts

Hallo Zusammen,

Ich trainiere gerade die Basics von C# (Nur Konsole) und erhalte folgende Fehlermeldung in Zeile 71.5, 79.5, 81.5 und 85.5: Unreachable code detected

Wo die Zeile ist habe ich hingeschrieben: ZEILE 71.5. Mein Problem beginnt bei Abschnitt: /*Mit dem else Befehl können wir die Ausgabe wie folgt steuern:

Nun, ich habe versucht eine Lösung zu finden, jedoch komme ich da alleine nicht weiter...

Weiss jemand was im Code falsch ist?

using System;

class MainClass {
  public static void Main (string[] args) {

  Console.WriteLine ("________________________________________");
  Console.WriteLine ("Mein Name ist B##.");
  Console.WriteLine ("Ich möchte C# einwandfrei beherrschen!");
  Console.WriteLine ("In dieser (repl) Freestyle ich C#");
  Console.WriteLine ("________________________________________");

  //Ab hier gehts los!
  /******************************************************************************/

  //Variable initialisieren:
  string name;
  int alter;
  bool erfahrung;

  //Variable deklarieren:
  name = "B##";
  alter = 19;
  erfahrung = true; //Wirklich nur ganz wenig bis jetzt... :-)
  

  //Variable ausgeben (Konsole):
  Console.WriteLine(name);
  Console.WriteLine(alter);
  Console.WriteLine(erfahrung);
  Console.WriteLine ("________________________________________");

  //String Variable mit mehr Text ausgeben:
  Console.WriteLine("Mein Name ist: " + name);
  Console.WriteLine("Kann man ein Bool und String zusammen printen? " + erfahrung);
  Console.WriteLine ("________________________________________");

  //Bools kann man auch direkt ausgeben in dem man eine Abfrage macht z.B:
  Console.WriteLine(5 < 4); //False da 4 nicht grösser als 5
  Console.WriteLine(88 > 79); //True da 88 grösser als 77
  Console.WriteLine(50 != 50); //False da die Zahlen sich nicht unterscheiden.
  Console.WriteLine(124 == 124); //True da beide die selben Zahlen sind.

  // Zahl1 < Zahl2 = Zahl1 kleiner als Zahl2. (true)
  // Zahl1 > Zahl2 = Zahl1 grösser als Zahl2. (true)
  // Zahl1 == Zahl2 = Zahl1 und Zahl2 dieselben Zahlen. (true)
  // Zahl1 != Zahl2 = Zahl1 und Zahl2 nicht die gleichen Zahlen. (true)
  // Das Gegenteil wäre in diesem Sinne false.
  Console.WriteLine ("________________________________________");

  //Conditional statements
  //Der Code soll ausgeführt werden wenn eine bestimmte Bedingung erfüllt ist z.B:
  if (5 > 4) { //if = wenn, (Abfrage), { Code der ausgeführt werden soll. }
    Console.WriteLine("Die Zahl 5 ist grösser als die Zahl 4!");
  }

  //if statements werden nur ausgeführt wenn die Abfrage true ist.
  string level = "Level 1";
  if (level == "Level 1") {
    Console.WriteLine ("Level 1 wird geladen...");
  }

  //if statements funktionieren mit allen Vergleichen die wir kennen (Siehe Bools).
  if (48 != 21) {
    Console.WriteLine ("Das sind nicht die selben Zahlen!");
  }

  /*Mit dem else Befehl können wir die Ausgabe wie folgt steuern:
  Ist die Bedingung true, dann wir der Code im if ausgeführt, ist die Bedingung nicht
  true sondern false, dann wird der Code im else ausgeführt.*/
  ZEILE 71.5 if (50 > 100) {
    Console.WriteLine ("50 ist grösser als 100.");
  } else { /* Der Else Befehl wird hinter dem "Codeblock zu Ende" begonnen, mit einem
           neuen Codeblock.*/
    Console.WriteLine ("50 ist nicht grösser als 100!");
  }

  /*Wenn wir nach dem if noch ein else if haben, wird der else if abgefragt wenn der if falsch ist. Sprich etwas anderes wird verglichen hingegen beim Else welcher nur ausgeführt wird wenn keine Bedingung erfüllt wird!*/
  if (100 > 102) {
    ZEILE 79.5 Console.WriteLine ("100 ist grösser als 102.");
  } else if (100 > 101) {
    ZEILE 81.5 Console.WriteLine ("100 ist grösser als 101.");
  } else if (100 < 101) {
    Console.WriteLine ("Die Zahl 100 ist kleiner als 101 und 102!");
  } else {
    ZEILE 85.5 Console.WriteLine ("Nichts davon stimmt!");
  }

   Console.WriteLine ("________________________________________");

   //Loops

  }
}

Vielen Dank für jede Unterstützung!

Gruss B##

Share this post


Link to post
Share on other sites

Die Syntax von deinem Code ist richtig, nur denkt der Compiler schon einen Schritt weiter..

z.B. '50 > 100' wird immer eine falsche Aussage sein, daher wird die Zeile 'Console.WriteLine("50 ist grösser 100");' unter keinen Umständen ausgeführt werden.

Da denkt sich der Compiler, dass das nicht richtig sein kann und gibt dir die Warnung 'Unreachable code detected' . Funktionieren sollte der Code trotzdem..

  • Thanks 1

Share this post


Link to post
Share on other sites

Hallo Mr 3d,

Ja der Code wird ausgeführt, es irritiert mich nur ein wenig weil nach der if Anweisung (50 > 100 ) er ja automatisch zum Else if rüber muss, da ist ja eigentlich klar das der Code nicht ausgeführt wird. Komisch, aber funktioniert wie es sollte, ich danke dir! :)

Share this post


Link to post
Share on other sites

Naja, komisch ist das nicht - der Compiler hat halt beigebracht bekommen, dass es besimmte Sachen gibt, die zwar nicht inkorrekt sind, aber mit sehr hoher Wahrscheinlichkeit ein Symptom für einen Denkfehler sind. Darum eben Warnungen.

Share this post


Link to post
Share on other sites

Komisch fand ich nur, das der Online Mono C# Compiler den Code perfekt ausgeführt hat, jedoch VS17 mir nur eine Fehlermeldung zurück gibt und es nicht ausführen möchte.

Share this post


Link to post
Share on other sites

Es ist eigentlich ganz einfach und auch nützlich.

Du nutzt in deinem Beispiel feste Werte, die (weil sie ja nun mal fest sind denn die 50 ändert sich nie und die 100 auch nicht) nie true werden und somit die nachfolgende Zeile niemals ausgeführt wird.
Natürlich greift dann else, aber die komplette Abfrage ist einfach unlogisch, weil sie immer zum gleichen Ergebnis führt.

Würdest du jetzt anstatt der Festwerte einfach Variablen einfügen, die du von außen verändern würdest, würde der Kompiler nicht meckern. Denn, obwohl der erste eingestellte Wert auch wieder immer das gleiche Ergebnis bringen würde, sind Variablen ja variabel und nun kann es ja immer zu anderen Ergebnissen kommen.

Die Compiler werden immer feiner im Erkennen und Melden von logischen Fehlern. VS17 hat jetzt einfach solch eine Überprüfungsroutine drin, und der Mono c# Compiler scheinbar nicht.
 

Share this post


Link to post
Share on other sites
vor 15 Stunden schrieb B##:

Komisch fand ich nur, das der Online Mono C# Compiler den Code perfekt ausgeführt hat, jedoch VS17 mir nur eine Fehlermeldung zurück gibt und es nicht ausführen möchte.

Compiler führt es immer perfekt aus nur wie wir vorgehen kann falsch sein :D

// Ein Beispiel was ähnlich ist, aber wo compiler nicht meckert.

// Beispiel: OnHit(40);

// Problem Beispiel:

void OnHit(float damage) {
	
	if(damage <= 50)
	{
		ReportLowDamageHit();
		return;
	}
	
	// Wird bis hier niemals ausführen, obwohl die die Funktion "perfekt" ist und tut was es tun soll.
	// denn damage wenn es unter 50 ist.. wird oben immer abgebrochen. Naja aber ReportNoDamageHit() wird aber nie ausgeführt.
	// Obwohl damage 70 sein könnte.. dennoch ist es hier unten unbrauchbar.. wird nie reingehen.
    // Compiler wird aber nicht meckern, da ja denkt.. mit über 50 wirst du dahinten ankommen. Nur nie in den If rein.
	
	if(damage <= 0)
	{
		ReportNoDamageHit();
		return;
	}
}

//Lösung Beispiel 1

void OnHit(float damage) {
	
	// Wird nicht ausgeführt, da damage = 40 is aber wäre es 0 würde es funktionieren.
	if(damage <= 0)
	{
		ReportNoDamageHit();
		return;
	}
		
		
	if(damage < 50)
	{
		ReportLowDamage();
		return;
	}
}

Beispiel 2 
void OnHit(float damage) {
	// Sieht wie das Problem Beispiel an.. nur dass wir hier sagen, dass es zwischen 0 und 50 (1 bis 49) gecheckt werden soll.
	if(damage > 0 && damage < 50)
	{
		ReportLowDamageHit();
		return;
	}
	
	if(damage <= 0)
	{
		ReportNoDamageHit();
		return;
	}
}

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×