2013-12-13, 12:42
  #1
Medlem
Hej,
sitter och fnular med detta, loopen ska skrivas ut baklänges och det funkar men sen kommer jag out of range. Hur fixar man det???
Tacksam för all hjälp

string[] skogsbär = new string[] {"blåbär","lingon","björnbär","krusbär" };

for (int i = 3; i < skogsbär.Length;i-- )
Console.WriteLine(skogsbär[i]);
Citera
2013-12-13, 12:46
  #2
Medlem
Protons avatar
Citat:
Ursprungligen postat av PurpleStars
Hej,
sitter och fnular med detta, loopen ska skrivas ut baklänges och det funkar men sen kommer jag out of range. Hur fixar man det???
Tacksam för all hjälp

string[] skogsbär = new string[] {"blåbär","lingon","björnbär","krusbär" };

for (int i = 3; i < skogsbär.Length;i-- )
Console.WriteLine(skogsbär[i]);
Du har tänkt lite knasigt, första elementet i arrayen har index 0 vilkert du kommer försöka läsa bakom med nuvarande logik, därför kraschar det.

Det du vill göra är ju att läsa skogsbär.Length till 0, alltså borde det se ut nåt sånt här:

[PHP]
for (int i = skogsbär.Length; i > -1 ;i-- )
[/PHP]

Vad händer om du provar så?
Citera
2013-12-13, 13:01
  #3
Medlem
TorrentLovers avatar
Första elementet i fältet/arrayen har i de flesta programmeringsspråk indexet 0.
Citera
2013-12-13, 13:52
  #4
Medlem
Citat:
Ursprungligen postat av Proton
Du har tänkt lite knasigt, första elementet i arrayen har index 0 vilkert du kommer försöka läsa bakom med nuvarande logik, därför kraschar det.

Det du vill göra är ju att läsa skogsbär.Length till 0, alltså borde det se ut nåt sånt här:

[PHP]
for (int i = skogsbär.Length; i > -1 ;i-- )
[/PHP]

Vad händer om du provar så?

Nä det funkar inte heller
När jag skriver som jag gjorde från början får jag ut listan krusbär, björnbär, lingon, blåbär och sen kommer jag out of range.
Några fler förslag??? :-)
Citera
2013-12-13, 14:14
  #5
Medlem
Marxamas avatar
Citat:
Ursprungligen postat av PurpleStars
Nä det funkar inte heller
När jag skriver som jag gjorde från början får jag ut listan krusbär, björnbär, lingon, blåbär och sen kommer jag out of range.
Några fler förslag??? :-)
Det beror på att sista elementet har index skogsbär.Length - 1. Dvs, kör med

Kod:
for (int i = skogsbär.Length - 1; i >= 0; i--)
Citera
2013-12-13, 15:08
  #6
Medlem
Citat:
Ursprungligen postat av Marxama
Det beror på att sista elementet har index skogsbär.Length - 1. Dvs, kör med

Kod:
for (int i = skogsbär.Length - 1; i >= 0; i--)


TUSEN TACK!!! Nu funkar det
Citera
2013-12-13, 22:33
  #7
Medlem
VB.NET gör detta snyggare

For i = ord.Length To 1 Step -1

Next i

Inga problem med att tänka fel angående 0- eller 1-baserat.
Klart enklare att tänka att man börjar på 1 och slutar där strängen är slut. Eller tvärtom.
Intuitivt - så som man räknar manuellt.
(Om vi måste tänka på att vi ska tänka som en CPU tänker, då kan vi lika gärna skriva maskinkod/assembler direkt eftersom C# introducerar en massa onödiga klockcykler hela tiden, men fanatiska CSharpers tror att de är mycket coolare än alla andra för att de har uppfattat den esoteriska visdomen att datorns minne börjar på 0 och inte på 1).

Å andra sidan är det ännu snyggare med LINQ och där vinner C#

Förutom när det gäller Linq to XML, där vinner VB:

Dim xmlData = <HelloWorld VB='1'>

Men vill du ha svårare XML programmering, så varsågod!
Implementera en egen SAX-parser då om du ska vara tuff Nej just det, du är CSharper, då vet du inte vad det är
Citera
2013-12-16, 15:37
  #8
Medlem
Citat:
Ursprungligen postat av Marxama
Det beror på att sista elementet har index skogsbär.Length - 1. Dvs, kör med

Kod:
for (int i = skogsbär.Length - 1; i >= 0; i--)

Hur gör den där loopen så att den läsas upp baklänges? Förstår inte riktigt.(Är bara intresserad av att lära mig så därför jag frågar, för har aldrig riktigt förstått när man skriver -1 efter Length.)
Citera
2013-12-16, 20:21
  #9
Medlem
John-Pauls avatar
Citat:
Ursprungligen postat av pkj
Hur gör den där loopen så att den läsas upp baklänges? Förstår inte riktigt.(Är bara intresserad av att lära mig så därför jag frågar, för har aldrig riktigt förstått när man skriver -1 efter Length.)

skögsbär har 4 element, och dessa numreras 0,1,2,3 så loopen måste börja på 3 eftersom den har 4 element (4 - 1) och stegvis räkna ner med 1 till och med 0 för att adressera elementen baklänges, 3,2,1,0.
Citera
2013-12-16, 21:00
  #10
Medlem
John-Pauls avatar
Citat:
Ursprungligen postat av Binary
VB.NET gör detta snyggare

For i = ord.Length To 1 Step -1

Next i

Inga problem med att tänka fel angående 0- eller 1-baserat.
Klart enklare att tänka att man börjar på 1 och slutar där strängen är slut. Eller tvärtom.
Intuitivt - så som man räknar manuellt.
(Om vi måste tänka på att vi ska tänka som en CPU tänker, då kan vi lika gärna skriva maskinkod/assembler direkt eftersom C# introducerar en massa onödiga klockcykler hela tiden, men fanatiska CSharpers tror att de är mycket coolare än alla andra för att de har uppfattat den esoteriska visdomen att datorns minne börjar på 0 och inte på 1).

Å andra sidan är det ännu snyggare med LINQ och där vinner C#

Förutom när det gäller Linq to XML, där vinner VB:

Dim xmlData = <HelloWorld VB='1'>

Men vill du ha svårare XML programmering, så varsågod!
Implementera en egen SAX-parser då om du ska vara tuff Nej just det, du är CSharper, då vet du inte vad det är

Jag håller med att noll känns onaturligt men samtidigt så är, i sekvens 3,4,5,6
1: 3 <= i < 7 trevligare än 2: 2 < i <= 6 och 3: 3 <= i <= 6 och 4: 2 < i < 7
I 2: Anges startvärdet före den naturliga sekvensen
I 3: Anges <= 2 ggr vilket är fult.
i 4: Anges startvärde och slutvärde utanför den naturliga sekvensen
och, man vet vad och att man har två bakom sig när man är på 5 då 2-0=2 i.st.f vad som är efter (som ännu är okänt, om man stegar framåt alltså, vilket är det vanliga). Men...naturligt är 1 bas.
__________________
Senast redigerad av John-Paul 2013-12-16 kl. 21:19.
Citera
2013-12-16, 21:00
  #11
Medlem
Citat:
Ursprungligen postat av John-Paul
skögsbär har 4 element, och dessa numreras 0,1,2,3 så loopen måste börja på 3 eftersom den har 4 element (4 - 1) och stegvis räkna ner med 1 till och med 0 för att adressera elementen baklänges, 3,2,1,0.

Okej då förstår jag, tack!
Citera
2013-12-20, 19:30
  #12
Medlem
Citat:
Ursprungligen postat av John-Paul
skögsbär har 4 element, och dessa numreras 0,1,2,3 så loopen måste börja på 3 eftersom den har 4 element (4 - 1) och stegvis räkna ner med 1 till och med 0 för att adressera elementen baklänges, 3,2,1,0.

Eller börja på 4 (längden) och räkna ner innan adresseringen istället för efter. Men for-loopar kör alltid inkrementeringen/dekrementeringen efter kroppen, så man får använda en while isf. Eller en for med tom uppdateringsdel.

Räkna uppåt:
Kod:
i = 0;
while (i != length) {
    /* använd i++ */
}

Räkna nedåt:
Kod:
i = length;
while (i != 0) {
    /* använd --i */
}
__________________
Senast redigerad av alef-noll 2013-12-20 kl. 19:34.
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in