Avatar billede fynbo Nybegynder
12. november 2004 - 10:42 Der er 22 kommentarer og
1 løsning

String og loops

Hej,

Et virkelig pinligt spørgsmål, men sidder fast med det.

Hvorfor kan mine variabler erklæret udenfor en foreach ikke bruges inden i en foreach?
Avatar billede aaberg Nybegynder
12. november 2004 - 10:46 #1
Variabler erklæret uden for en foreach skulle helst virke fint inden i en foreach. Kan du ikke vise noget kode, så er det lidt nemmere at svare på?
Avatar billede Spotgun Seniormester
12. november 2004 - 10:47 #2
Enig med Aaberg80. Har lige lavet en hurtig test, og der virker det ganske upåklageligt.
Avatar billede fynbo Nybegynder
12. november 2004 - 10:50 #3
string navn;
if(bla bla){
  foreach(bla bla){
  navn = "hej";
  ..
    foreach(bla bla){
      navn += "hej hej";
    }
  ..
  }
}
MessageBox.Show(navn);
..
Avatar billede fynbo Nybegynder
12. november 2004 - 10:51 #4
det er navn += "hej hej"; den fejler ved:
"Use of unassigned local variable "navn""
Avatar billede skwat Praktikant
12. november 2004 - 10:57 #5
du kan i din kode komme ud for at du aldrig har sat navn til noget
Avatar billede skwat Praktikant
12. november 2004 - 10:58 #6
string navn;
navn = "ingentingellernoget";
if(bla bla){
  foreach(bla bla){
  navn = "hej";
  ..
    foreach(bla bla){
      navn += "hej hej";
    }
  ..
  }
}
MessageBox.Show(navn);
Avatar billede fynbo Nybegynder
12. november 2004 - 10:58 #7
sætter jo navn til "hej" ?
Avatar billede fynbo Nybegynder
12. november 2004 - 10:58 #8
prøver
Avatar billede skwat Praktikant
12. november 2004 - 10:58 #9
det var et svar
Avatar billede burningice Nybegynder
12. november 2004 - 10:59 #10
til forskel fra simple typer som int, double osv., så er en string ikke automatisk initialiseret til at starte med. Dvs, at når du skriver

string navn;

så har du oprettet en variabel af typen string, men den peger ikke nogle steder hen.
at bruge += operatoren er det samme som at skrive

navn = navn + "hej hej";

Dette kræver en aflæsning af variabel navn, da computeren jo ellers ikke ved hvad navn indeholder og derfor heller ikke kan lave den nye streng som navn skal indeholde. Og fejlen kommer så i det sekund hvor at computeren prøver at aflæse navn, for hvordan var det lige det var... den peger jo ikke nogen steder hen !!

Løsning: initialiser altid dine variaber

string navn = "";
if(bla bla){
  foreach(bla bla){
  navn = "hej";
  ..
    foreach(bla bla){
      navn += "hej hej";
    }
  ..
  }
}
MessageBox.Show(navn);
Avatar billede skwat Praktikant
12. november 2004 - 12:04 #11
dit problem var at hvis nu bla bla == false så kommer du aldrig ind i din assignment, men til gengæld skyder du den ind i din messagebox
Avatar billede Syska Mester
12. november 2004 - 12:55 #12
nej, det er hvad fessor skriver.... har selv været ude for det, og nu har jeg fået en forklaring hvorfor.....
Avatar billede skwat Praktikant
12. november 2004 - 13:35 #13
string navn; - flot vi har en string der peger ingen steder hen
if(bla bla){ -en if
  foreach(bla bla){
  navn = "hej"; - hov hvad sker der her?
  ..
    foreach(bla bla){
      navn += "hej hej"; - når han kommer hertil vil navn være .equals hej
    }
  ..
  }
}
MessageBox.Show(navn);
¨
Problemet er ikke +=, men at der er en vej igennemkoden hvor navn ikke bliver initialiseret.
Avatar billede burningice Nybegynder
12. november 2004 - 17:27 #14
skwat>> brug nu dine øjne, læs og bliv klogere

Kommentar: fynbo
12/11-2004 10:51:08

hvis det var fordi at koden aldrig kom ind i if-kodeblokken, så ville fejlen nok heller ikke ske ved

navn +=-linjen

vel ?
Avatar billede skwat Praktikant
12. november 2004 - 19:37 #15
hvis du ikke kan se det er det samme vi skriver så (CENSUR)

Farven har bare en anden lyd. Jeg er sikker på at den fejl kommer fra VS og ikke runtime
Avatar billede burningice Nybegynder
12. november 2004 - 21:15 #16
skwat>> u can't possible be serious ?!

hvordan skulle vs kunne vide hvornår en variabel er true eller false? Hvad nu hvis værdien af bla bla var afhængig af en brugers input:

bla bla = (input.IndexOf("hej") > -1);

skulle vs kunne regne ud om bla bla var true eller false når at ovenstående if-statement blev compilet?
Avatar billede skwat Praktikant
12. november 2004 - 22:18 #17
Jeg håber vi taler forbi hinanden det jeg siger er:

VS kan se at der er en mulighed, læs (kan ske, måske, i nogle tilfælde, ikke nødvendigvis altid)

static void Main(string[] args)
{
string test;
string navn;
test = Console.ReadLine();
if(test.Equals("bla"))
{
navn = "hej";

navn += "hej hej";
}
Console.WriteLine(navn);
}

vil vs ikke være med til, fordi den kan se at navn kan blive ref. til uden at der er kommet noget i den. men hvis vi laver en s/string navn;/string navn = ""; så går det godt nok.
Avatar billede Syska Mester
13. november 2004 - 02:04 #18
så skal den jo også i alle tilfælde tildeles en værdi, du er på dybt vand skwat
Avatar billede skwat Praktikant
13. november 2004 - 13:17 #19
Jeg tillader at citere mig selv fra min første kommentar "du kan i din kode komme ud for at du aldrig har sat navn til noget" - Hvor er det dybe vand?
Avatar billede Syska Mester
13. november 2004 - 18:37 #20
hmmm, er nok lidt forvirret nu, eller måske er det bare ikke mig der er helt med på hvad:
s/string navn;/string navn = ""; er???
????

Men igen, der skal noget i "navn" inden han kommer ind i hans loop, det er vi enige om ik? Den skal initialiseres??
Avatar billede skwat Praktikant
14. november 2004 - 12:46 #21
nemlig....
s/string navn;/string navn = ""; er regexp. og betyder substitude string navn; med string navn = "";
Avatar billede Syska Mester
14. november 2004 - 13:43 #22
har du et link til at noget det regexp, ser det mange gange, men har aldrig rigtig fået sat mig ind i det?

// ouT
Avatar billede skwat Praktikant
14. november 2004 - 14:16 #23
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

IT-JOB

Styrelsen for Grøn Arealomlægning og Vandmiljø

Teamleder til Application Management

AL Sydbank A/S (tidligere Arbejdernes Landsbank)

Tech Lead til Datacenter Operations

AL Sydbank A/S (tidligere Arbejdernes Landsbank)

Afdelingschef til GDPR & Tech Regulation