Gå til innhold

ProgrammeringsBaren! Småprat, om det du elsker!


Anbefalte innlegg

Videoannonse
Annonse

Har et lite spørsmål angående Java jeg håper noen kan hjelpe med.

 

Utdrag:

 

System.out.println("Oppgi et desimaltall: ");
double tall = input.nextDouble();

System.out.println("Skriv en streng: ");
String streng = input.nextLine();

 

Når jeg kjører dette, så blir jeg spurt om en doubleverdi, men istedet for å så bli spurt om en streng, så hopper programmet over "String streng = input.nextLine();", og fortsetter med koden som kommer etter. Hvorfor blir det sånn? Vet at jeg kan fikse det ved å putte "input.nextLine();" mellom linje fire og fem, men det ser litt sånn halveis ut. Er det noen bedre måte å gjøre det på?

Lenke til kommentar

av en eller annen grunn looper dette 4 ganger før den anser seg som ferdig, noen som kan peke på den og si "derfor... det er jo åpenbart" Er skrevet i "autoit" skripte språket, ekstremt løst basert på c++

 

For $kolonne = 0 To UBound($getTables, 1) - 1 ; telle hvor mange kolonner som er i arrayet

 $resultData = $resultData & @LF ; @lf er linjebrudd
 For $rad = 0 To UBound($getTables, 2) - 1 ; samme som den andre for loopen, men denne er for radene
  $episodenumber = $getTables[1][$rad] & " " ; $getTables er et array med informasjon i, litt for mye
  $episodenumber = StringRegExp($episodenumber,'\d{1,}',2) ; hent ut bare det jeg vil ha, i dette tilfellet bare tall
  $resultData = $getTables[3][$rad] & " " ; hele episode navnet blir skrevet til variabel
  $regClean = StringRegExp($resultData, '.+\n|.+\r', 2) ; rydde litt i navnet
  FileWrite($filename, $episodenumber[0] & " - " & $regClean[0]) ; skriver både episode tall og navn til en fil
 Next
Next

Lenke til kommentar

av en eller annen grunn looper dette 4 ganger før den anser seg som ferdig, noen som kan peke på den og si "derfor... det er jo åpenbart" Er skrevet i "autoit" skripte språket, ekstremt løst basert på c++

 

For $kolonne = 0 To UBound($getTables, 1) - 1 ; telle hvor mange kolonner som er i arrayet

 $resultData = $resultData & @LF ; @lf er linjebrudd
 For $rad = 0 To UBound($getTables, 2) - 1 ; samme som den andre for loopen, men denne er for radene
  $episodenumber = $getTables[1][$rad] & " " ; $getTables er et array med informasjon i, litt for mye
  $episodenumber = StringRegExp($episodenumber,'\d{1,}',2) ; hent ut bare det jeg vil ha, i dette tilfellet bare tall
  $resultData = $getTables[3][$rad] & " " ; hele episode navnet blir skrevet til variabel
  $regClean = StringRegExp($resultData, '.+\n|.+\r', 2) ; rydde litt i navnet
  FileWrite($filename, $episodenumber[0] & " - " & $regClean[0]) ; skriver både episode tall og navn til en fil
 Next
Next

Det ligner ikke på C++ på noen som helst måte; det der er en BASIC dialekt.

Men det er egentlig irrelevant.

 

Du blander mellom 0 og 1 indeksering ser det ut til.

Lenke til kommentar

Du blander mellom 0 og 1 indeksering ser det ut til.

 

Er ikke helt sikker på hva du mener der, nå skal det da sies at jeg har sitti i hele natt og skrevet dette programmet, så mye mulig at jeg roter noe vilt, du orker ikke copy paste den linjen du mener jeg har gjort feil på.

 

Er ganske fersk på dette med programmering. :/

 

Dersom det hjelper hiver jeg hele greia jeg har skrevet inn hær.

 

http://pastebin.com/Xgys65d5

Endret av Dwagon
Lenke til kommentar

Jeg er ikke sikker på hva som er galt, bare pekte på noe som kunne væe inkonsistent.

 

Det er en relativt fundamental forskjell mellom programmeringsspråk. Det er naturlig for mennesker å telle 1, 2, 3, 4, men i noen programmeringsspråk (som C, C++, C#, Java) så benytter man 0-indeksering. Det betyr at man teller 0, 1, 2, 3, 4 etc. Men i Visual Basic, og muligens AutoIt så er det valgfritt. Jeg mener at den implisitt bruker 1-indeksering.

 

I Visual Basic (kan ikke AutoIt) bestemmer man dette slik:

 

Dim myArray As Integer(0 To 99) ' Definer et array som bruker 0-indeksering

 

Dette betyr at første indeks i arrayet er 0, altså må en For løkke se ut som den du bruker i koden.

 

Men jeg mener, uten å være helt sikker på dette, at dersom du bare skriver slik:

 

Dim myArray As Integer(100)

 

Så benytter Visual Basic 1 indeksering, og da kan For løkken se slik ut:

 

For indeks = 1 To UBound(myArray)

 

I koden er det blandet hva som brukes:

UBound($getTables, 1) &--#60;- Ser ut som 1-indeksering

$episodenumber = $getTables[1][$rad] &--#60;- Er i praksis en 0-indeksering, fordi $rad starter på 0.

 

Det er ikke helt sikkert at dette er problemet (fordi det i VB ihvertfall er fullt mulig å blande dette), men det var det første jeg så når jeg så over koden.

 

Men hvis UBound benytter seg av 0-indeksering så kan det hende den første iterasjonen bare går én gang.

Endret av GeirGrusom
  • Liker 1
Lenke til kommentar

 

 

Jeg er ikke sikker på hva som er galt, bare pekte på noe som kunne væe inkonsistent.

 

Det er en relativt fundamental forskjell mellom programmeringsspråk. Det er naturlig for mennesker å telle 1, 2, 3, 4, men i noen programmeringsspråk (som C, C++, C#, Java) så benytter man 0-indeksering. Det betyr at man teller 0, 1, 2, 3, 4 etc. Men i Visual Basic, og muligens AutoIt så er det valgfritt. Jeg mener at den implisitt bruker 1-indeksering.

 

I Visual Basic (kan ikke AutoIt) bestemmer man dette slik:

 

Dim myArray As Integer(0 To 99) ' Definer et array som bruker 0-indeksering

 

Dette betyr at første indeks i arrayet er 0, altså må en For løkke se ut som den du bruker i koden.

 

Men jeg mener, uten å være helt sikker på dette, at dersom du bare skriver slik:

 

Dim myArray As Integer(100)

 

Så benytter Visual Basic 1 indeksering, og da kan For løkken se slik ut:

 

For indeks = 1 To UBound(myArray)

 

I koden er det blandet hva som brukes:

UBound($getTables, 1) &--#60;- Ser ut som 1-indeksering

$episodenumber = $getTables[1][$rad] &--#60;- Er i praksis en 0-indeksering, fordi $rad starter på 0.

 

Det er ikke helt sikkert at dette er problemet (fordi det i VB ihvertfall er fullt mulig å blande dette), men det var det første jeg så når jeg så over koden.

 

Men hvis UBound benytter seg av 0-indeksering så kan det hende den første iterasjonen bare går én gang.

 

 

Tror jeg skjønner, grunnen til at jeg har skrevet det slik som jeg har gjort er for at mitt $getTables array er et " 2 dimensjonalt" array, og i autoit krever UBound() at man gir array og dimensjoner, slik at den teller det rett, så begge mine for loops starter på 0, og jobber seg mot slutten.

 

Det er derfor det også står -1 etter UBound() funksjonen

 

Endrer jeg for eks til

 

For $kolonne = 0 To UBound($getTables, 0) - 1

og

For $rad = 0 To UBound($getTables, 1) - 1

 

Får jeg bare 8 linjer fra resultatet som egentlig skal være på 43 linjer for dette arrayet, men det er 2 ganger 4 linjer av samme.

 

Lar jeg

For $rad = 0 To UBound($getTables, 2) - 1

stå får jeg dobbelt opp resultat.

 

Og om jeg endrer begge til 0, får jeg 4 linjer, med 2 av det samme.

 

La ved et bilde som viser hvordan arrayet ser ut

 

Informasjonen den henter er som følger $getTables[0][3] og $getTables[0][1], det første tallet er det som skal "endres" på i for loopen min. Slik at jeg får skrevet ut alle episodene og tallene dems.

 

 

Edit... Når tror jeg at jeg starter å komme nermere. Ser ut som ubound teller "feil" vei.

 

Hver kolonne har 4 rader 0 til 3. Og derfor sier han at den bare er 4 stor. Makan altså. Nå må jeg finne ut hvordan jeg endrer retningen til UBound >.<

post-51297-0-11682700-1348038991_thumb.png

Endret av Dwagon
Lenke til kommentar

 

 

Jeg er ikke sikker på hva som er galt, bare pekte på noe som kunne væe inkonsistent.

 

Det er en relativt fundamental forskjell mellom programmeringsspråk. Det er naturlig for mennesker å telle 1, 2, 3, 4, men i noen programmeringsspråk (som C, C++, C#, Java) så benytter man 0-indeksering. Det betyr at man teller 0, 1, 2, 3, 4 etc. Men i Visual Basic, og muligens AutoIt så er det valgfritt. Jeg mener at den implisitt bruker 1-indeksering.

 

I Visual Basic (kan ikke AutoIt) bestemmer man dette slik:

 

Dim myArray As Integer(0 To 99) ' Definer et array som bruker 0-indeksering

 

Dette betyr at første indeks i arrayet er 0, altså må en For løkke se ut som den du bruker i koden.

 

Men jeg mener, uten å være helt sikker på dette, at dersom du bare skriver slik:

 

Dim myArray As Integer(100)

 

Så benytter Visual Basic 1 indeksering, og da kan For løkken se slik ut:

 

For indeks = 1 To UBound(myArray)

 

I koden er det blandet hva som brukes:

UBound($getTables, 1) &--#60;- Ser ut som 1-indeksering

$episodenumber = $getTables[1][$rad] &--#60;- Er i praksis en 0-indeksering, fordi $rad starter på 0.

 

Det er ikke helt sikkert at dette er problemet (fordi det i VB ihvertfall er fullt mulig å blande dette), men det var det første jeg så når jeg så over koden.

 

Men hvis UBound benytter seg av 0-indeksering så kan det hende den første iterasjonen bare går én gang.

 

 

Tror jeg skjønner, grunnen til at jeg har skrevet det slik som jeg har gjort er for at mitt $getTables array er et " 2 dimensjonalt" array, og i autoit krever UBound() at man gir array og dimensjoner, slik at den teller det rett, så begge mine for loops starter på 0, og jobber seg mot slutten.

 

Det er derfor det også står -1 etter UBound() funksjonen

 

Endrer jeg for eks til

 

For $kolonne = 0 To UBound($getTables, 0) - 1

og

For $rad = 0 To UBound($getTables, 1) - 1

 

Får jeg bare 8 linjer fra resultatet som egentlig skal være på 43 linjer for dette arrayet, men det er 2 ganger 4 linjer av samme.

 

Lar jeg

For $rad = 0 To UBound($getTables, 2) - 1

stå får jeg dobbelt opp resultat.

 

Og om jeg endrer begge til 0, får jeg 4 linjer, med 2 av det samme.

 

La ved et bilde som viser hvordan arrayet ser ut

 

Informasjonen den henter er som følger $getTables[0][3] og $getTables[0][1], det første tallet er det som skal "endres" på i for loopen min. Slik at jeg får skrevet ut alle episodene og tallene dems.

 

 

Edit... Når tror jeg at jeg starter å komme nermere. Ser ut som ubound teller "feil" vei.

 

Hver kolonne har 4 rader 0 til 3. Og derfor sier han at den bare er 4 stor. Makan altså. Nå må jeg finne ut hvordan jeg endrer retningen til UBound >.<

 

 

Har løst det, problemet var ikke med hvordan arrayet var satt opp eller lest, det var med måten jeg hadde skrevet for loopen.

 

Delte den opp i 2 looper fremfor slik det orginalt var, og nå funker det som bare tusan.

 

 

For $kolonne = 0 To UBound($getTables, 1) - 1
 $resultData = $resultData & @LF
Next
For $rad = 0 To UBound($getTables, 2) - 1
  $episodenumber = $getTables[1][$rad] & " "
  $episodenumber = StringRegExp($episodenumber,'\d{1,}',2)
  $resultData = $getTables[3][$rad] & " "
  $regClean = StringRegExp($resultData, '.+\n|.+\r', 2)

 

Slik rett og slett, og beklager dobbelposten, men hver gang jeg trykker edit så forsvinner mine > < tegn.

Lenke til kommentar
  • 2 uker senere...

Var broti en liten feil på jobben i dag, og kom egentlig frem til at det kanskje er en uting å ha en return på slutten av en funksjon med mange flyter i seg, altså:

 

int SomeFunction(bool foo, bool bar)
{
 int result = 0;
 if(!foo && !bar)
 {
result = 1;
 }
 else if(!foo && bar)
 {
result = 2;
 }
 else if(foo && !bar)
 {
throw "Failed";
 }
 return result;
}

 

vs:

 

int SomeFunction(int foo, int bar)
{
 if(!foo && !bar)
 {
return 1;
 }
 else if(!foo && bar)
 {
return 2;
 }
 else if(foo && !bar)
 {
throw "Failed";
 }
}

 

Dette er en forenkling for å forklare problematikken, og det er ganske åpenbart at det er feil her, men det er også hensikten. Det som er poenget er at jeg mener det ikke er noe fornuftig å bruke én felles return for mange kontrollflyter, da dette vil føre til at siste tilfellet faller igjennom selv om utvikleren ikke har implementert det korrekt. Dersom man benytter return for alle sluttverdier der flyten faktisk er ferdig, så vil kompilatoren istedet si ifra at ikke alle flyter returnerer en verdi.

 

Tanker?

Endret av GeirGrusom
  • Liker 1
Lenke til kommentar

Jeg bruker som oftest return inne i blokken, slik du har i eksempel 2.

 

Men det er vel et annet problem med koden her, hva sjer hvis både foo og bar er true? Da treffer ingen av testene, og hva returner da funksjonen (eksempel 2)?

Det var poenget. I eksempel 2, så får du ikke kompilert, men i eksempel 1 så går det rett igjennom og returnerer 0, selv om det kanskje ikke var hensikten med koden.

Lenke til kommentar

OK. Planen er altså å bruke kompilatoren som redningsplanke; det stod kanske i den endringen det?

 

Jeg er ikke sikker på om det hjelper så mye; det eneste kompilatoren forteller deg, er at du mangler en return på slutten av koden ...

 

Da ville jeg heller ha throwen stående for seg selv uten noe if rundt, eller i en ren else blokk. Du er ikke sikret at du har fått med deg alle casene, men du får i hvertfall en exception som ikke du ventet.

  • Liker 1
Lenke til kommentar

OK. Planen er altså å bruke kompilatoren som redningsplanke; det stod kanske i den endringen det?

 

Jeg er ikke sikker på om det hjelper så mye; det eneste kompilatoren forteller deg, er at du mangler en return på slutten av koden ...

 

Da ville jeg heller ha throwen stående for seg selv uten noe if rundt, eller i en ren else blokk. Du er ikke sikret at du har fått med deg alle casene, men du får i hvertfall en exception som ikke du ventet.

Det hjelper ikke mye, men det kan hjelpe litt. Du blir tvunget til å fullføre alle mulige flyter av IDE og kompilator.

Lenke til kommentar

Jeg skjønner ikke helt problemet. Hva er uting med å ha retur på slutten av funksjonen? Litt av greia med å ha den til slutt er vel nettopp det å sikre at en verdi blir sendt tilbake til funksjonskallet? Du kan jo også la vær å ha return i hver av if-else-ene og kun gi en returnvariabel en gitt verdi, så kan du heller sende tilbake en -1 dersom du vil ha en feilsjekk. Det blir litt ryddigere etter min mening, og feil er det i allefall ikke.

  • Liker 2
Lenke til kommentar

Har et lite spørsmål angående Java jeg håper noen kan hjelpe med.

 

Utdrag:

 

System.out.println("Oppgi et desimaltall: ");
double tall = input.nextDouble();

System.out.println("Skriv en streng: ");
String streng = input.nextLine();

 

Når jeg kjører dette, så blir jeg spurt om en doubleverdi, men istedet for å så bli spurt om en streng, så hopper programmet over "String streng = input.nextLine();", og fortsetter med koden som kommer etter. Hvorfor blir det sånn? Vet at jeg kan fikse det ved å putte "input.nextLine();" mellom linje fire og fem, men det ser litt sånn halveis ut. Er det noen bedre måte å gjøre det på?

 

Gjorde et kjapt søk på dette, og fant at grunnen til ditt problem er det at 'henger med' en streng, dvs return-tegnet, fra forrige input, og dermed når neste spørsmål om input av streng kommer, godtar programmet det som ligger i buffer (nemlig return-tegnet) som neste streng, og hopper dermed videre i programmet. Vet ikke hvor enkelt det er å gjøre en flush buffer her (har ikke programmert mye java som du skjønner, men det går også an å legge inn en input.nextLine() som du er inne på, ignorere den, og be om en ny ...

 

Her er svaret jeg fant på google:

 

If you type '2' (for incorrect details) note that you actually type <2> <enter> so two chars are present in the input buffer; the nextInt() method reads the <2>, takes it from the buffer and converts it to an int but it leaves the <enter> in the input buffer (because its not part of an int representation). Next you attempt to read an entire line, that method finds the <enter> character in the input buffer and duly decides that you have typed an empty line and returns.

You have to get rid of that <enter> key in the input buffer; simply read a line by calling the nextLine() method (and discard its return value) before you want to read a client's name.

kind regards,

Jos

Lenke til kommentar

Jeg skjønner ikke helt problemet. Hva er uting med å ha retur på slutten av funksjonen? Litt av greia med å ha den til slutt er vel nettopp det å sikre at en verdi blir sendt tilbake til funksjonskallet? Du kan jo også la vær å ha return i hver av if-else-ene og kun gi en returnvariabel en gitt verdi, så kan du heller sende tilbake en -1 dersom du vil ha en feilsjekk. Det blir litt ryddigere etter min mening, og feil er det i allefall ikke.

Jeg liker å bruke return i if-setningene da jeg da kan være rimelig sikker på at bugs lengre nede ikke påvirker returverdien.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...