Balthier Skrevet 18. september 2012 Del Skrevet 18. september 2012 Finner det vanskeligere å lære #BASH enn python Lenke til kommentar
siDDis Skrevet 18. september 2012 Del Skrevet 18. september 2012 Ikkje programmer i Bash er du snill, bruk heller sh. Det fungerer mykje betre på fleire plattformer og ytelsen er mykje betre. Bash er shellet du normalt jobber i, men ikkje det du vil eksekvere programkode med. Lenke til kommentar
tomsi42 Skrevet 18. september 2012 Del Skrevet 18. september 2012 Jeg vil heller anbefale korn shell (ksh) det er mer standard enn bash. Jeg synes standard sh er litt for primitivt. Men alle tre er uansett vanskeligere enn python Lenke til kommentar
KompleX Skrevet 18. september 2012 Del Skrevet 18. september 2012 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
Dwagon Skrevet 19. september 2012 Del Skrevet 19. september 2012 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
GeirGrusom Skrevet 19. september 2012 Del Skrevet 19. september 2012 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
Dwagon Skrevet 19. september 2012 Del Skrevet 19. september 2012 (endret) 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 19. september 2012 av Dwagon Lenke til kommentar
GeirGrusom Skrevet 19. september 2012 Del Skrevet 19. september 2012 (endret) 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 19. september 2012 av GeirGrusom 1 Lenke til kommentar
Dwagon Skrevet 19. september 2012 Del Skrevet 19. september 2012 (endret) 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 >.< Endret 19. september 2012 av Dwagon Lenke til kommentar
Dwagon Skrevet 19. september 2012 Del Skrevet 19. september 2012 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
GeirGrusom Skrevet 1. oktober 2012 Del Skrevet 1. oktober 2012 (endret) 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 1. oktober 2012 av GeirGrusom 1 Lenke til kommentar
tomsi42 Skrevet 1. oktober 2012 Del Skrevet 1. oktober 2012 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)? 1 Lenke til kommentar
GeirGrusom Skrevet 1. oktober 2012 Del Skrevet 1. oktober 2012 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
Matsemann Skrevet 1. oktober 2012 Del Skrevet 1. oktober 2012 (endret) tomsi: Her ville jo kompilator/editor trolig si i fra at en ikke er garantert at det returneres en int. Endret: for sein Endret 1. oktober 2012 av Matsemann Lenke til kommentar
tomsi42 Skrevet 1. oktober 2012 Del Skrevet 1. oktober 2012 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. 1 Lenke til kommentar
GeirGrusom Skrevet 1. oktober 2012 Del Skrevet 1. oktober 2012 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
Kanutus Skrevet 1. oktober 2012 Del Skrevet 1. oktober 2012 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. 2 Lenke til kommentar
Kanutus Skrevet 1. oktober 2012 Del Skrevet 1. oktober 2012 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
tomsi42 Skrevet 1. oktober 2012 Del Skrevet 1. oktober 2012 Det hjelper ikke mye, men det kan hjelpe litt. Du blir tvunget til å fullføre alle mulige flyter av IDE og kompilator. Jeg har ikke tiltro til at IDE og kompilator kan garantere alle mulige flyter. 1 Lenke til kommentar
tomsi42 Skrevet 1. oktober 2012 Del Skrevet 1. oktober 2012 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
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå