Permalänk
Medlem

Nybörjarfrågor, SWITCH

Jag gör ett program (skoluppgift) där man ska få användaren om den tycker 1 att skriva något, som när man trycker 2 ska det som skrevs under 1:an komma upp, men jag får ej till det.

case 1:
Console.Write("Vilken är din favoritfärg? ");
string skrivText = Console.ReadLine();

break;

case 2:
Console.WriteLine(skrivText );
isRunning = true;
break;

Den säger alltså att under case 2, skrivText saknar värde, hur löser jag det?
Eller gör jag jättefel allt ihop?

Permalänk
Medlem

Du måste deklarera skrivText utanför switch-blocket om du vill kunna använda variabeln i alla case, annars kommer den bli lokal till endast case 1 (fel, se mitt inlägg längre ner). Se t.ex. hur du redan använder isRunning.

Permalänk
Medlem

wild shot, det har inget med Console.WriteLine(skrivText ); mellanslaget mellan t och ) att göra? kommer inte alls ihåg nå c#...

Permalänk
Moderator

Det har att göra med när du deklarerar variabler, dvs "string skrivText".
Du måste lägga ut mer av din kod för att kunna få hjälp med var det rätta stället är.

Med tanke på felmeddelandet du får så får jag känslan att du har deklarerat skrivText två gånger. Den borde klaga på att variabeln inte finns snarare än säga att den är tom.

Permalänk
Medlem
Skrivet av giplet:

Med tanke på felmeddelandet du får så får jag känslan att du har deklarerat skrivText två gånger. Den borde klaga på att variabeln inte finns snarare än säga att den är tom.

Jag tänkte också det först, men inser nu att C# inte har några speciella regler för case utan hanterar det på samma sätt som t.ex. C++. D.v.s. ett case definierar inte ett nytt namnomgång (om man inte explicit lägger dit { }), utan skrivText är deklarerad i hela switch-satsen i det här fallet.

Däremot kan inte kompilatorn garantera att case 1 körs innan case 2, så den klagar på att skrivText kan användas oinitialiserad i case 2. Lösningen blir densamma: se till att skrivText är deklarerad före switch-satsen och har ett värde (t.ex. en tom sträng).

Permalänk
Moderator
Skrivet av perost:

Jag tänkte också det först, men inser nu att C# inte har några speciella regler för case utan hanterar det på samma sätt som t.ex. C++. D.v.s. ett case definierar inte ett nytt namnomgång (om man inte explicit lägger dit { }), utan skrivText är deklarerad i hela switch-satsen i det här fallet.

Däremot kan inte kompilatorn garantera att case 1 körs innan case 2, så den klagar på att skrivText kan användas oinitialiserad i case 2. Lösningen blir densamma: se till att skrivText är deklarerad före switch-satsen och har ett värde (t.ex. en tom sträng).

Ja, så kan det mycket väl vara. Vi måste ändå se mer av koden för att kunna tala om var variabeln ska deklareras. Den bör deklareras åtminstone utanför den loop som jag gissar omsluter switch-satsen.

Permalänk
Medlem
Skrivet av Islandesess:

Jag gör ett program (skoluppgift) där man ska få användaren om den tycker 1 att skriva något, som när man trycker 2 ska det som skrevs under 1:an komma upp, men jag får ej till det.

case 1:
Console.Write("Vilken är din favoritfärg? ");
string skrivText = Console.ReadLine();

break;

case 2:
Console.WriteLine(skrivText );
isRunning = true;
break;

Den säger alltså att under case 2, skrivText saknar värde, hur löser jag det?
Eller gör jag jättefel allt ihop?

Du deklarerar skrivText i case 1, den dör efter break;
Så du kan inte referera den i case 2.

Det du skriver nu är ungefär som att skriva (antar jag då mycket av koden saknas).

var userInput = int.Parse(Console.ReadLine()); if(userInput == 1) { Console.Write("Vilken är din favoritfärg? "); string skrivText = Console.ReadLine(); } else if(userInput == 2) { Console.WriteLine(skrivText); isRunning = true; }

Som du ser då är skrivText enbart deklarerad inom första if-satsen, så den går ej att referera i else-if.
Det ska inte ens kompilera, med en varning att "skrivText does not exist in current context".

Det du vill göra är att deklarera den utanför scopet och då sätta värdet i 1 och skriva ut det i 2.
Tänk på att deklarera den utanför loopen också, annars kommer den att skrivas över vid varje iteration.

Edit: tydligen räknas en hel switch sats som ett lokalt scope, men som perost säger så kan inte kompilatorn veta att case 1 alltid kommer att köras innan 2.

Permalänk
Medlem

Har lyckats få bort felmedelandet, men vet inte vad jag ska skriva efter string skrivText = ("");
Alltså efter = för nu blir det ju ej svaret från fråga 1, utan blankt.

Console.Write("\tVälj: ");
string skrivText = ("");
int menyVal = Convert.ToInt32(Console.ReadLine());

switch (menyVal)
{
case 1:
Console.Write("Vilken är din favoritfärg? ");
skrivText = Console.ReadLine();

break;

case 2:
Console.WriteLine(skrivText );
isRunning = true;
break;

Permalänk
Medlem
Skrivet av Islandesess:

Har lyckats få bort felmedelandet, men vet inte vad jag ska skriva efter string skrivText = ("");
Alltså efter = för nu blir det ju ej svaret från fråga 1, utan blankt.

Console.Write("\tVälj: ");
string skrivText = ("");
int menyVal = Convert.ToInt32(Console.ReadLine());

switch (menyVal)
{
case 1:
Console.Write("Vilken är din favoritfärg? ");
skrivText = Console.ReadLine();

break;

case 2:
Console.WriteLine(skrivText );
isRunning = true;
break;

Som jag skrev ovan, du måste deklarera den utanför loopen annars kommer den att skrivas över i varje iteration med ett tomt värde.
Använd string.Empty eller "". Du behöver inte paranteser.

Permalänk
Medlem

@zaibuf:
tack, jag löste det
Så skönt