C# Kompileringsfel vid definering av vektor

Trädvy Permalänk
Medlem
Registrerad
Mar 2019

C# Kompileringsfel vid definering av vektor

Console.WriteLine("Ange hur många mätningar som har utförts: "); string input = Console.ReadLine(); double temp = Convert.ToDouble(input); double[] Temperature = new double[temp]; //På denna raden får jag meddelandet "Cant implicitly convert type double to an int" Console.WriteLine("Ange grader i celsius vid varje mätning: ");

Felet försvinner om jag ändrar variabel "temp" till datatypen int. Varför sker detta? bara nyfiken, användarens inmatning i temp ska egentligen vara en int oavsett. Eftersom det är antalet gånger temperaturen har mäts som ska matas in.

Trädvy Permalänk
Medlem
Plats
Arboga
Registrerad
Jan 2002

Du kan inte ha en array med 'double' antal platser, det måste vara en int. Man kan ju inte ha 3.75 platser i en array.

Skickades från m.sweclockers.com

Intel Core i7 6700K | Gigabyte Z170X-UD3 | Corsair Vengeance LPX 16GB DDR4 2400Mhz | EVGA GTX 980Ti Hybrid | Samsung 950 PRO 256GB | Noctua NH-D15 | EVGA G2 750 | Fractal Design Define R5

Trädvy Permalänk
Medlem
Registrerad
Okt 2012

Läa på kring hur du skapar en array (vektor).
Det du anger inom [] är storleken, vilken måste anges som ett heltal.

Jag misstänker att du egentligen vill placera din variabel temp i arrayen vilket går att göra på ett flertal olika sätt.

Trädvy Permalänk
Medlem
Registrerad
Apr 2006
Skrivet av Zajin:

Du kan inte ha en array med 'double' antal platser, det måste vara en int. Man kan ju inte ha 3.75 platser i en array.

Skickades från m.sweclockers.com

För att undvika missförstånd, man kan så klart ha en array med doubles men däremot inte referera till ett element annat än via ett heltal, precis som @zajin skriver.

Det lär för övrigt inte krävas en double för att lagra antalet mätningar som gjorts och att (försöka) lagra det i en array med namn temperature känns inte helt lyckat. Ja, en array i sig känns rätt dumt också eftersom svaret på frågan rimligtvis är ett heltal.

Trädvy Permalänk
Medlem
Registrerad
Mar 2019

Tack för snabbt svar, det är ju solklart nu, stirrat mig blind på vissa deler i koden.

Vad jag försöker göra är att be användaren mata in hur många temperaturer som det ska vara för att sedan ange varje temperaturen i vektorn med hjälp av foreach loopen. Har redan klarat det med for loopen men jag får det inte riktigt att funka med foreach.

For loopen adderar ju hela tiden ett steg i iterationen, men foreach går ju från start till slut. Så hur interagerar jag med foreach loopens index?

Trädvy Permalänk
Medlem
Registrerad
Okt 2012
Skrivet av Zero_Digits:

Tack för snabbt svar, det är ju solklart nu, stirrat mig blind på vissa deler i koden.

Vad jag försöker göra är att be användaren mata in hur många temperaturer som det ska vara för att sedan ange varje temperaturen i vektorn med hjälp av foreach loopen. Har redan klarat det med for loopen men jag får det inte riktigt att funka med foreach.

For loopen adderar ju hela tiden ett steg i iterationen, men foreach går ju från start till slut. Så hur interagerar jag med foreach loopens index?

Antalet mätningar är ju då förstås ett heltal precis som du skrev i ditt första inlägg.
Vad är anledningen till att du vill använda en foreach loop? För att mata in värden i en sådan array känns en for loop som det enda rätta.

Trädvy Permalänk
Medlem
Registrerad
Mar 2019

@FrazzorXx: Jag har inte så mycket kunskap om foreach så ville mest testa vattnet lite och få lite förståelse för hur den funkar. På vilket sätt passar den inte till denna uppgiften?

Trädvy Permalänk
Medlem
Registrerad
Nov 2011

@Zero_Digits
En foreach används för att iterera över en kollektion, d.v.s. har du en lista av strängar så kan du enkelt komma åt varje strängvärde utan att först manuellt behöva läsa ut den från ett index.

foreach (String value in myList) { Console.WriteLine(value); }

En for-loop däremot itererar x gånger oavsett om där finns en kollektion. Om du t.ex. vet att du vill läsa in 10 värden i en array är det därmed lämpligt att ha en for-loop som börjar på index 0 och slutar på index 9.

for (int i = 0; i < 10; i++) { myArray[i] = "something"; }

AMD Ryzen 7 1700X 3.8 GHz 20MB | ASUS PRIME X370-PRO | MSI GeForce GTX 1080 Gaming X 8GB | G.Skill 16GB DDR4 3200 MHz CL14 Flare X | Corsair RM650x 650W

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Jun 2010
Skrivet av Zero_Digits:

@FrazzorXx: Jag har inte så mycket kunskap om foreach så ville mest testa vattnet lite och få lite förståelse för hur den funkar. På vilket sätt passar den inte till denna uppgiften?

Jag tycker det passar ypperligt. Använder du VS så får du (väl? Jag har resharper så jag vet inte vad som ingår i vanliga VS) en bra start på en foreach-loop. Exempelvis:

foreach(var value in Collection) { ... }

Trädvy Permalänk
Medlem
Registrerad
Okt 2012

@snajk:
Kollektionen är ju för tilfället tom så det finns ingen anledning att iterera över den.
(Osäker på vad som faktiskt finns i arrayen, null?)
Syftet i detta fallet är ju att mata in värden så även om man använder en foreach loop måste man ju ändå ha en index variabel

Exempel:
var i = 0
foreach(var t in Temperature)
{
Temperature[i] = Console.ReadLine();
i++;
}

Edit:
Resharper är för övrigt ett ypperligt verktyg som lägger till en hel del funktionalitet (även om mycket numer finns inbyggt i VS, än mer iomed VS2019).
Det kan dock vara lite dyrt för privatpersoner/studenter men jag tror att de erbjuder gratis licenser till vissa skolor som har avtal med JetBrains.

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Aug 2013
Skrivet av FrazzorXx:

@snajk:
Kollektionen är ju för tilfället tom så det finns ingen anledning att iterera över den.
(Osäker på vad som faktiskt finns i arrayen, null?)
Syftet i detta fallet är ju att mata in värden så även om man använder en foreach loop måste man ju ändå ha en index variabel

Exempel:
var i = 0
foreach(var t in Temperature)
{
Temperature[i] = Console.ReadLine();
i++;
}

Edit:
Resharper är för övrigt ett ypperligt verktyg som lägger till en hel del funktionalitet (även om mycket numer finns inbyggt i VS, än mer iomed VS2019).
Det kan dock vara lite dyrt för privatpersoner/studenter men jag tror att de erbjuder gratis licenser till vissa skolor som har avtal med JetBrains.

Vi får ReSharper gratis som student via Microsoft Imagine

Skickades från m.sweclockers.com

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Jun 2010
Skrivet av FrazzorXx:

@snajk:
Kollektionen är ju för tilfället tom så det finns ingen anledning att iterera över den.
(Osäker på vad som faktiskt finns i arrayen, null?)
Syftet i detta fallet är ju att mata in värden så även om man använder en foreach loop måste man ju ändå ha en index variabel

Exempel:
var i = 0
foreach(var t in Temperature)
{
Temperature[i] = Console.ReadLine();
i++;
}

Edit:
Resharper är för övrigt ett ypperligt verktyg som lägger till en hel del funktionalitet (även om mycket numer finns inbyggt i VS, än mer iomed VS2019).
Det kan dock vara lite dyrt för privatpersoner/studenter men jag tror att de erbjuder gratis licenser till vissa skolor som har avtal med JetBrains.

Arrayen är inte Tom utan den innehåller så många heltal (eller float, double etc.) som den har slots. Default för nummer är noll så det går utmärkt att iterera över den för att sätta värdena.

Sen håller jag med om att en for-loop passar bättre om man behöver veta eller använda positionen i arrayen, men det behöver man ju inte i detta fall. Foreach(int t in Temperature) betyder ju att t är objektet eller värdet på aktuell position så det är bara att sätta t = int.parse...

Nu skriver jag detta på telefonen och har inte möjlighet att testa, så jag kan inte svära på att det funkar precis så, men rätt säker är jag.

Trädvy Permalänk
Medlem
Registrerad
Okt 2012

@snajk:
Du har förstås rätt i att arrayen innehåller default double (0).

Det kommer dock inte att fungera att sätta t inom foreach loopen.
För det första är det ju enbart en double som inte har någon som referens till kollektionen.
För det andra är den inte tillåtet att sätta din iterationsvariabel i någon foreach loop i C# (förmodligen gäller detta hela .net), det kommer att ge dig kompilerings fel "Cannot assign to 't' because it is a 'foreach iteration variable'"

(Hjälpte dig skriva ett test, som förstås inte går att kompilera)

[TestMethod] public void TestForeachOverArray() { var collection = new double[2]; CollectionAssert.AreEqual(new[] {0.0, 0.0}, collection); var random = new Random(); foreach (var d in collection) { d = random.NextDouble(); } }

Dold text

Men.. nu har vi spårat ur lite ifrån ts frågeställning.
Till ts: Använd inte en foreach loop i syfte att mata in värden.

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Jun 2010
Skrivet av FrazzorXx:

@snajk:
Du har förstås rätt i att arrayen innehåller default double (0).

Det kommer dock inte att fungera att sätta t inom foreach loopen.
För det första är det ju enbart en double som inte har någon som referens till kollektionen.
För det andra är den inte tillåtet att sätta din iterationsvariabel i någon foreach loop i C# (förmodligen gäller detta hela .net), det kommer att ge dig kompilerings fel "Cannot assign to 't' because it is a 'foreach iteration variable'"

(Hjälpte dig skriva ett test, som förstås inte går att kompilera)

[TestMethod] public void TestForeachOverArray() { var collection = new double[2]; CollectionAssert.AreEqual(new[] {0.0, 0.0}, collection); var random = new Random(); foreach (var d in collection) { d = random.NextDouble(); } }

Dold text

Men.. nu har vi spårat ur lite ifrån ts frågeställning.
Till ts: Använd inte en foreach loop i syfte att mata in värden.

Yes, du har förstås rätt, man kan inte tillsätta iterationsvariabeln. Däremot kan man ju göra typ:

int[] Temperature = new int[10]; int i = 0; foreach (var t in Temperature) { Temperature[i] = i * 3; i++; } foreach(var t in Temperature) Console.WriteLine("nummer: " + t);

Kanske lika bra med en for-loop då förstås.