Förstår inte felkoden jag får?? C#

Permalänk

Förstår inte felkoden jag får?? C#

Hej!

Trodde att jag var klar med uppgiften men får nu en felkod jag inte alls förstår inte kan inte lösa den.
Detta är en skoluppgift (amerikanen i basun) så har vissa rama att hålla mig innanför, typ som att man ska kommentera koden kanske lite onödigt mycket.
Och jag är fullt medveten om att det är massa felstav i kommentarerna, har dyslexi och ska självklart rätta felstavningarna innan jag skickar in den.
Vill bara få en förklaring på varför den helt plötsligt ger en fel kod när jag använder ''cel'' trotts att det gått hur bra som helst i resten av koden.
Bifogar koden här

using System; namespace Bastu { class Program { public static double FahrToCel(int fahr)//method that takes in int fahr (fahrenheit) but converts it to double cel (celcius) and returns cel { double cel = Convert.ToDouble(fahr); //converts int to double cel = (fahr - 32.0) * 5.0 / 9.0; //converts fahernheit to celsius return cel; } static void Main(string[] args) { double maxTemp = 77.0; // deklare values so we leter on can use the verible . double minTemp = 73.0; double optiTemp = 75.0; double cel; int fahr; Console.WriteLine("Welcome to the Sauna!"); do // the loop starts with asking the user to enter a temerature { Console.Write("Please enter a temperature in fahrenheit: "); try // The ''try'' will catch a mistake for exemeple is the user write a letter insded of a number { fahr = int.Parse(Console.ReadLine()); // the number is read and given the verible fahr cel = FahrToCel(fahr); // the metod FahrTocel is calld to make fahr into cel, witch the program will use from now on } catch (Exception)// If the use did wirte a letter insede of a number this will happend { Console.WriteLine("Please enter only numbers"); continue;// So the loop starts from the begining agin and not just stops here } if (cel > maxTemp)//if the temp is to high the program will as for a new number, as well as telling the use what the temp in now(with only one desimal) { Console.WriteLine("The Sauna is too hot! Its " + Math.Round(cel, 1) + " celcius. Turn down the temperature!"); } else if (cel < minTemp)//if the temp is to low the program will as for a new number, as well as telling the use what the temp in now(with only one desimal) { Console.WriteLine("The Sauna is too cold! Its only " + Math.Round(cel, 1) + " celcius. Turn up the temperature!"); } else if (cel == optiTemp)//if this is true the loop will end here beacuse the temp is perfect. And the code in this block will aper. { Console.WriteLine("The Sauna now has a perfect temperature of " + Math.Round(cel, 1) + "celcius! Have a nice visit!"); } else//if non of the above was true this will show beacuse the temp is in den middel of the lowset and highes accepteble, and the loop will end here. { Console.WriteLine("The sauna has a decent temperature now of " + Math.Round(cel, 1) + " celcius! Enjoy"); } } while (cel >= minTemp || cel <= maxTemp); //deturns how long the loop will continue. Console.ReadKey(); } } }

while (cel >= minTemp || cel <= maxTemp); //deturns how long the loop will continue.

Här visar den felet: Error CS0165: Use of unassigned local variable 'cel' (CS0165) (bastun3)

varför visar den det bara här??

Permalänk
Medlem

cel har inget värde när koden ska avgöra uttrycket i while-loopen.

Skickades från m.sweclockers.com

Visa signatur

Windows 11 Pro | Intel i7 8700 | ASUS Prime Z370-P | Corsair 16GB 3000MHz | ASUS GTX 1080 | Fractal Design Define S | Corsair RM750x | Hyper 212 EVO

Permalänk
Medlem

Själva scenariot som felmeddelandet handlar om är felscenariot där exception kastas och du hamnar i din catch istället för att cel får ett värde.
När du då kommer till jämförelsen cel >= minTemp || cel <= maxTemp så har cel aldrig fått något värde tilldelat, vilket är just vad felmeddelandet försöker uppmärksamma dig på.

Visa signatur

Desktop: Ryzen 5800X3D || MSI X570S Edge Max Wifi || Sapphire Pulse RX 7900 XTX || Gskill Trident Z 3600 64GB || Kingston KC3000 2TB || Samsung 970 EVO Plus 2TB || Samsung 960 Pro 1TB || Fractal Torrent || Asus PG42UQ 4K OLED
Proxmox server: Ryzen 5900X || Asrock Rack X570D4I-2T || Kingston 64GB ECC || WD Red SN700 1TB || Blandning av WD Red / Seagate Ironwolf för lagring || Fractal Node 304

Permalänk
Skrivet av Joppis:

cel har inget värde när koden ska avgöra uttrycket i while-loopen.

Skickades från m.sweclockers.com

Skrivet av evil penguin:

Själva scenariot som felmeddelandet handlar om är felscenariot där exception kastas och du hamnar i din catch istället för att cel får ett värde.
När du då kommer till jämförelsen cel >= minTemp || cel <= maxTemp så har cel aldrig fått något värde tilldelat, vilket är just vad felmeddelandet försöker uppmärksamma dig på.

okej, jag förstår.... hur ska jag lösa det?

Permalänk
Medlem
Skrivet av hannaanonym:

okej, jag förstår.... hur ska jag lösa det?

En variant är ju att se till att ett värde alltid blir tilldelat innan du fortsätter. T.ex. skulle du kunna ha en egen loop för inmatningen som tar om den tills den lyckats.

Visa signatur

Desktop: Ryzen 5800X3D || MSI X570S Edge Max Wifi || Sapphire Pulse RX 7900 XTX || Gskill Trident Z 3600 64GB || Kingston KC3000 2TB || Samsung 970 EVO Plus 2TB || Samsung 960 Pro 1TB || Fractal Torrent || Asus PG42UQ 4K OLED
Proxmox server: Ryzen 5900X || Asrock Rack X570D4I-2T || Kingston 64GB ECC || WD Red SN700 1TB || Blandning av WD Red / Seagate Ironwolf för lagring || Fractal Node 304

Permalänk
Medlem
Skrivet av hannaanonym:

okej, jag förstår.... hur ska jag lösa det?

Skriver du in graderna med komma eller punkt? Funkar det om du inte anger ett decimaltal?

Edit, missade att du bara tog in ett heltal.
I din catch(Exception) kan du skriva ut felmeddelandet genom att fånga Exception.

try{ ... } catch(Exception ex){ Console.WriteLine(ex.Message); // skriver ut ditt felmeddelande istället för att hoppa över det. }

Visa signatur

NZXT H510 Flow MSI B450 Tomahawk MAX
AMD Ryzen 5800X3D RX 7900XTX Kingston Fury 64GB

Permalänk

@evil penguin:

det är nu det verkligen märks hur ny jag är på detta xD
finns det något annat sätt? ditt sätt lät bra men jag förstår inte hur jag ska göra det... försökte med att lägga till tilldelningen av värdet till cel där jag deklarerat det andra. det tog bort felmeddelande i slutet men det blev ett felmeddelande i deklarationen eftersom fahr inte fått sitt värde än...
tänk om man bara kunde fatta allt.....

Permalänk
Skrivet av Pamudas:

Skriver du in graderna med komma eller punkt? Funkar det om du inte anger ett decimaltal?

Edit, missade att du bara tog in ett heltal.
I din catch(Exception) kan du skriva ut felmeddelandet genom att fånga Exception.

try{ ... } catch(Exception ex){ Console.WriteLine(ex.Message); // skriver ut ditt felmeddelande istället för att hoppa över det. }

men detta löser fortfarande inte felmeddelandet jag får, det som jag nämnde överst..

Permalänk
Hedersmedlem

Om du använder TryParse istället för Parse kan du rätt lätt göra en loop som inte låter dig komma ifrån inmatningen innan du angett ett bra värde. Typ:

while(!TryParse(...

Tricket här är att inte köra någon annan kod om du inte fått in ett tal från användaren.

Sedan kan du fundera på hur användaren ska kunna komma ifrån det hela. Säg att man bara vill avbryta och stänga av bastun.

Visa signatur

Använd gilla för att markera nyttiga inlägg!

Permalänk
Skrivet av giplet:

Om du använder TryParse istället för Parse kan du rätt lätt göra en loop som inte låter dig komma ifrån inmatningen innan du angett ett bra värde. Typ:

while(!TryParse(...

Tricket här är att inte köra någon annan kod om du inte fått in ett tal från användaren.

Sedan kan du fundera på hur användaren ska kunna komma ifrån det hela. Säg att man bara vill avbryta och stänga av bastun.

hade gärna gjort det men läraren vill att vi spesifikt använder try catch

Permalänk
Medlem

Du kan ange default värden för cel och fahr till 0.

Skickades från m.sweclockers.com

Permalänk

Icke-initierade variabler är i de flesta fall en dum idé så börja med att göra precis det.

double cel = 0; int fahr = 0;

Permalänk
Skrivet av zaibuf:

Du kan ange default värden för cel och fahr till 0.

Skickades från m.sweclockers.com

Skrivet av the_weird:

Icke-initierade variabler är i de flesta fall en dum idé så börja med att göra precis det.

double cel = 0; int fahr = 0;

omg tack!!!! Det löste allt!!
Världens godaste jul på er!! <3

Permalänk
Hedersmedlem
Skrivet av hannaanonym:

omg tack!!!! Det löste allt!!
Världens godaste jul på er!! <3

Ditt felmeddelande försvann, men ditt program borde nu varna för låg temperatur om man tex skriver in APA som första input. Andra gången loopen körs kommer den att använda det gamla värdet även om du skriver in något ogiltigt. Är detta rätt?

Visa signatur

Använd gilla för att markera nyttiga inlägg!

Permalänk
Medlem
Skrivet av giplet:

Ditt felmeddelande försvann, men ditt program borde nu varna för låg temperatur om man tex skriver in APA som första input. Andra gången loopen körs kommer den att använda det gamla värdet även om du skriver in något ogiltigt. Är detta rätt?

Resten av loop-kroppen hoppas väl över om man skriver in något ogiltigt p.g.a. continue; i catch-satsen, eller missar jag något?

Permalänk
Hedersmedlem
Skrivet av perost:

Resten av loop-kroppen hoppas väl över om man skriver in något ogiltigt p.g.a. continue; i catch-satsen, eller missar jag något?

Japp. Jag som läser dåligt.

Visa signatur

Använd gilla för att markera nyttiga inlägg!