Klass, väderstation uppgift .Programmering 1

Permalänk
Medlem

Klass, väderstation uppgift .Programmering 1

Tjena! Jag behöver lite hjälp igen med min kod. Hade googlat, och läste en del men är ändå helt blockerad. Jag får den fel när jag försöker testa koden:

System.StackOverflowException
HResult=0x800703E9
Message=Ett undantagsfel av typen System.StackOverflowException inträffade.

Jag förstår att det kör infinite och därför funkar inte men fattar inte riktigt varför? Jag kollade också andra person kod som hittade på nätet och ser ut lik min och det fungerar.

Börja att känna mig så dumt med programmering, ibland känns att jag hade förstått men 5 min senare är jag helt förvirrad igen.

Stor tack i förhand.

Koden är:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Väderstation_; namespace Väderstation_ { public class Temp_city // new class, temperature and city name. { string stad; int temp; public Temp_city(string stad, int temp) //constructor { this.Stad = stad; this.Temp = temp; } public Temp_city() { } public string Stad { get { return Stad; } set { Stad = value; } //HÄR ÄR PROBLEMET } public int Temp { get { return Temp; } set { Temp = value; } //OCH HÄR } public override string ToString() { return Stad + " " + Temp; } public void Write() { Console.WriteLine("In" + Stad + "the temperature is" + Temp + "°C"); Console.ReadLine(); } } internal class Program { static int Linksok(List<Temp_city> list, int key) //Lineal searching { for (int i = 0; i < list.Count; i++) { if (list[i].Temp == key) return i; } return -1; } static void Write (List<Temp_city>mylist) { for (int i = 0; i <mylist.Count; i++) { Console.WriteLine(mylist[i]); } } public static void Bubblesort(List<Temp_city> cities)//Bubblesort searching. { int max = cities.Count - 1; for (int i = 0; i < max; i++) { int nrLeft = max - i; for (int j = 0; j < nrLeft; j++) { if (cities[j].Temp > cities[j + 1].Temp) { Temp_city tmp = cities[j]; cities[j] = cities[j + 1]; cities[j + 1] = tmp; } } } } static void Main(string[] args) { List<Temp_city> mylist = new List<Temp_city>(); Console.WriteLine("Welcome to the weather station!"); Console.ReadLine(); for (int i = 0; i <= 3; i++) { Temp_city city = new Temp_city(); Console.Write("\nPlease write a city name:"); string stad = Console.ReadLine(); city.Stad = stad; Console.Write("\nPlease write the temperature:"); int temp = Convert.ToInt32(Console.ReadLine()); city.Temp = temp; if (temp >= -60 && temp <= 60) { mylist.Add(city); continue; } else { Console.WriteLine("Wrong temperature! Please write it again"); break; } } Console.Write(mylist); Console.WriteLine("Bubblesort"); Bubblesort(mylist); Write(mylist); Console.ReadLine(); } } }

Permalänk
Medlem

public string Stad { get { return Stad; } set { Stad = value; } //HÄR ÄR PROBLEMET } public int Temp { get { return Temp; } set { Temp = value; } //OCH HÄR }

Prova och spar värdet i instans-variablarna.

Annat sätt att göra samma sak:
https://learn.microsoft.com/en-us/dotnet/csharp/programming-g...

Permalänk
Medlem

Vad är det för värden i din klass som ska uppdateras av dina Set-metoder, och hur stavas de variablerna? Tänk på vad "Stad" respektive "stad" innebär i din kod och att det representerar olika saker.

Permalänk
Medlem
Skrivet av Mr.W:

public string Stad { get { return Stad; } set { Stad = value; } //HÄR ÄR PROBLEMET } public int Temp { get { return Temp; } set { Temp = value; } //OCH HÄR }

Prova och spar värdet i instans-variablarna.

Annat sätt att göra samma sak:
https://learn.microsoft.com/en-us/dotnet/csharp/programming-g...

Tack ska kolla det och byta min kod då och ser om det funkar.

Permalänk
Medlem
Skrivet av cwolf86:

Vad är det för värden i din klass som ska uppdateras av dina Set-metoder, och hur stavas de variablerna? Tänk på vad "Stad" respektive "stad" innebär i din kod och att det representerar olika saker.

Ja, så i uppgiften jag skulle börja med att skapa en klass som innehåller två attribute : int temp, string namn. (kanske bor dumt att använda bara "Stad" där.. ska byta till StadNamn)

Sen när jag kör programmet då ska jag testa klasserna och metoderna, programmet ska sortera städer namn och temperatur med kallande först osv ...(har inte kommit än till den här punkt) men i alla fall använde jag "stad" igen i min for loop för att lagra den som användaren hade skrivit. Är det rätt tänkt det eller är jag helt bort lösningen?

Permalänk
Medlem
Skrivet av Mr.W:

public string Stad { get { return Stad; } set { Stad = value; } //HÄR ÄR PROBLEMET } public int Temp { get { return Temp; } set { Temp = value; } //OCH HÄR }

Prova och spar värdet i instans-variablarna.

Annat sätt att göra samma sak:
https://learn.microsoft.com/en-us/dotnet/csharp/programming-g...

STOR TACK, det funkade.

public class Temp_city // new class, temperature and city name. { public int temp { get; set; } public string cityName { get; set; } public Temp_city(int temp, string cityName) //Constructor { this.temp = temp; this.cityName = cityName; }

Nu ska jag börja gå genom de andra grejer jag inte fattar heller än xD Tack igen!

Permalänk
Medlem
Skrivet av flopi:

Ja, så i uppgiften jag skulle börja med att skapa en klass som innehåller två attribute : int temp, string namn. (kanske bor dumt att använda bara "Stad" där.. ska byta till StadNamn)

Sen när jag kör programmet då ska jag testa klasserna och metoderna, programmet ska sortera städer namn och temperatur med kallande först osv ...(har inte kommit än till den här punkt) men i alla fall använde jag "stad" igen i min for loop för att lagra den som användaren hade skrivit. Är det rätt tänkt det eller är jag helt bort lösningen?

Det jag menade var att det är attributen i klassen, "stad" och "temp", som du vill ändra med din set-metod och returnera med din get-metod. Alltså är "stad" och "temp" de variabler som du ska använda i "public string Stad" och "public int Temp". Det finns inget variabel som heter "Stad" i din klass, så när du kör koden "Stad = value;" i din set-metod blir det fel. Här borde det stå "stad = value" för att sätta ditt attribut.

Nu har du löst det genom att förenkla koden med att skriva de triviala get/set-metoderna direkt när du skapar dina attribut, men jag tänker ändå att det är viktigt att första vad du faktiskt vill åstadkomma med set/get-metoderna i din klass.

Permalänk
Medlem
Skrivet av cwolf86:

Det jag menade var att det är attributen i klassen, "stad" och "temp", som du vill ändra med din set-metod och returnera med din get-metod. Alltså är "stad" och "temp" de variabler som du ska använda i "public string Stad" och "public int Temp". Det finns inget variabel som heter "Stad" i din klass, så när du kör koden "Stad = value;" i din set-metod blir det fel. Här borde det stå "stad = value" för att sätta ditt attribut.

Nu har du löst det genom att förenkla koden med att skriva de triviala get/set-metoderna direkt när du skapar dina attribut, men jag tänker ändå att det är viktigt att första vad du faktiskt vill åstadkomma med set/get-metoderna i din klass.

Just det, nu fattar jag vad du menar. Tack för förklaring. Jag skulle hade lämnat som det var men ville ändå testa det som du säger och skrev koden igen på den sättet och funkar!

public class Temp_city // new class, temperature and city name attributes. { private int temp; private string cityName; public Temp_city(int temp, string cityName) //Constructor { this.Temp = temp; this.CityName = cityName; } public string CityName { get { return cityName; } set { cityName = value; } } public int Temp { get { return temp; } set { temp = value; } }

Permalänk
Medlem

För att förtydliga så är alltså problemet att om du har en property som heter Stad så kommer get-metoden att anropas när värdet på Stad hämtas och set-metoden när värdet på Stad tilldelas. Så t.ex. return Stad; i get-metoden kommer anropa get-metoden, som returnerar Stad, som anropar get-metoden, som returnerar Stad, o.s.v. tills programmet får slut på stackminne och kraschar med en stack overflow.