Miksi tämä koodi ei voi toimia?
print "["; path$; "]";: input "$", cline$ dim m$(7) split(cline$, ";",m$(),0)) for laskuri = 0 to 7 print laskuri if lcase$(m$(laskuri)) = "exit" then end if lcase$(m$(laskuri)) = "clear" then cls if lcase$(mid$(m$(laskuri), 1,2)) = "./" then shell path$ + "\" + rtrim$(ltrim$(mid$(cline$, 4,300))) if lcase$(mid$(m$(laskuri), 1,2)) = "ls" then shell "dir | more" if lcase$(mid$(m$(laskuri), 1,2)) = "cd" then path$ = ltrim$(rtrim$(mid$(cline$, 4,300))): chdir path$ if lcase$(mid$(m$(laskuri), 1,2)) = "rm" then kill ltrim$(rtrim$(mid$(cline$, 4,300))) if lcase$(mid$(m$(laskuri), 1,3)) = "pwd" then print path$ if lcase$(mid$(m$(laskuri), 1,4)) = "echo" then echo (ltrim$(rtrim$(mid$(cline$,6,300)))) if lcase$(mid$(m$(laskuri), 1,5)) = "rmdir" then rmdir ltrim$(rtrim$(mid$(cline$, 7,300))) if lcase$(mid$(m$(laskuri), 1,5)) = "mkdir" then mkdir ltrim$(rtrim$(mid$(cline$, 7,300))) if lcase$(mid$(m$(laskuri), 1,5)) = "sleep" then sleep val(ltrim$(rtrim$(mid$(cline$, 7,300)))) next laskuri goto prompt FUNCTION split% (stringi$, erotin$, taulu$(), max%) se$ = stringi$ 'ei rikota alkuper?ist? teksti?... kohta% = INSTR(se$, erotin$) 'miss? kohdassa on eka erotin$ IF kohta% = 0 THEN EXIT FUNCTION'jos ei ole yht??n niin ei anneta yht??n WHILE kohta% 'etsit??n lis?? kunnes ei erotinta l?ydy en?? taulu$(ne%) = LEFT$(se$, kohta% - 1) 'lis?t??n l?ydetty taulukkoon se$ = MID$(se$, kohta% + LEN(erotin$)) 'irrotetaan jo l?ydetty ne% = ne% + 1 'lis?t??n laskuria kohta% = INSTR(se$, erotin$) 'miss? kohdassa seuraava erotin$ IF ne% = max% THEN 'jos ei haluta en?? niin ei anneta en?? split% = ne% EXIT FUNCTION END IF WEND taulu$(ne%) = se$ 'viimeinen osa split% = ne% + 1 'kerrotaan montako l?ytyi END FUNCTION
Eli tuo on eräänlainen komentokehoite niin siinä pitäisi onnistua monen komennon suorittaminen samaanaikaan tjs..
esimerkki:
ls ; echo moi ; echo heh; sleep 5 ; echo olipa äsken tauko
niin se ensin näyttäisi hakemiston tiedostot ja sitten moi, heh, tulisi 5sekuntin tauko (FreeBasicissa pitää olla 5000) ja sitten taas tulee tekstiä, joka on "olipa äsken tauko". Minulla tuo ei tee mitään vaan suoritta vain ekan komennon/ei tee yhtikäs mitään.
Milläs FB:n versiolla olet kääntänyt?
Ainakin 0.14b antaa kääntäessä ilmoituksen
testii.bas(3) : error 71: Array not dimensioned, before: '(' split(cline$, ";",m$(),0))
Aha... tuossa oli yksi virhe, kun itse yritin viritellä jotain purkkavirityksiä enkä itsekkään saanut juuri tuolla toimimaan mitään, mutta toiset koodipätkät taas toimivat siihen saakka, kunnes olisi pitänyt suorittaa monta komentoa kerrallaan.
Yksi virhe johtua siitä kun komentoa suoritetaan (if lauseen lopussa) niin mid kattoo arvon koko komento rivin alusta vaikka olisi jo viimeinen komento menossa eli muuta lopusta
$cline ---> m$(laskuri)
Ja pientä korjaus suositusta:
korvaa noi TRim ja LTrim lauseet pelkällä Trim:millä, joka poistaa välit automaatisesti alusta ja lopusta eli
RTrim + LTrim = Trim
Ja noi välilyöntejä ei tule jos korvataan toi mid lauseen 300 luku tälläi Len(Komento rivi kokonaan) - Komennon nimen pituus (Len functio palauttaa merkkijonon pituuden)
Ja toi lurahin kertoma virhe tulee siitä että split on functio ei subi
jolloin juhaz on tehny function, sliptin ja subin ristiriitaan.
Vaihda noi Function sanat Sub sanaoihin niin pitäisi toimia
Öh... meikä ei nyt ihan tajunnut? :D
Viitsitkö laittaa esimerkkikoodin niin jos ymmärtäis mitä tarkoitit...
Tarkastelin tota koodi vähän enemmän ja ymmärsin että Split Functio palauttaa komentojen määrän. taulukon osien määrän pystyy myös katsomaan Ubound käskyllä jolloin tuo For:rrin loppu olisi UBound(m$) (en taaskaan tiedä toimiiko tämä ubound QB/FB:ssä) Tässä koodissa pitäisi olla korjattuna ne virheet mitä luettelin edellisessa viestissä.
print "["; path$; "]";: input "$", cline$ Dim m$(7) Dim monta monta = split(cline$, ";", m$(), 0) 'Split palauttaa arvon kuinka monta komentoo löytyy 'ja laittaa lajittelun tulokset m$() taulukkoon For laskuri = 0 To monta Print laskuri If LCase$(m$(laskuri)) = "exit" Then End If LCase$(m$(laskuri)) = "clear" Then Cls If LCase$(Mid$(m$(laskuri), 1, 2)) = "./" Then Shell Path$ + "\" + RTrim$(LTrim$(Mid$(m$(laskuri), 4, Len(m$(laskuri)) - 4))) If LCase$(Mid$(m$(laskuri), 1, 2)) = "ls" Then Shell "dir | more" If LCase$(Mid$(m$(laskuri), 1, 2)) = "cd" Then Path$ = Trim$(Mid$(m$(laskuri), 4, Len(m$(laskuri)) - 4)): ChDir Path$ If LCase$(Mid$(m$(laskuri), 1, 2)) = "rm" Then Kill Trim$(Mid$(m$(laskuri), 4, Len(m$(laskuri)) - 4)) If LCase$(Mid$(m$(laskuri), 1, 3)) = "pwd" Then Print Path$ If LCase$(Mid$(m$(laskuri), 1, 4)) = "echo" Then echo Trim$(Mid$(m$(laskuri), 6, Len(m$(laskuri)) - 6)) If LCase$(Mid$(m$(laskuri), 1, 5)) = "rmdir" Then RmDir Trim$(Mid$(m$(laskuri), 7, Len(m$(laskuri)) - 7)) If LCase$(Mid$(m$(laskuri), 1, 5)) = "mkdir" Then MkDir Trim$(Mid$(m$(laskuri), 7, Len(m$(laskuri)) - 7)) If LCase$(Mid$(m$(laskuri), 1, 5)) = "sleep" Then sleep Val(Trim$(Mid$(m$(laskuri), 7, Len(m$(laskuri)) - 7))) Next laskuri 'GoTo prompt 'en tiedä missä kohti tämän promptin pitäis olla Function split%(stringi$, erotin$, taulu$(), max%) se$ = stringi$ 'ei rikota alkuperäistä tekstiä... kohta% = InStr(se$, erotin$) 'missä kohdassa on eka erotin$ If kohta% = 0 Then Exit Function 'jos ei ole yhtään niin ei anneta yhtään While kohta% 'etsitään lisää kunnes ei erotinta löydy enää taulu$(ne%) = Left$(se$, kohta% - 1) 'lisätään läydetty taulukkoon se$ = Mid$(se$, kohta% + Len(erotin$)) 'irrotetaan jo löydetty ne% = ne% + 1 'lisätään laskuria kohta% = InStr(se$, erotin$) 'missä kohdassa seuraava erotin$ If ne% = max% Then 'jos ei haluta enää niin ei anneta enää split% = ne% Exit Function End If Wend taulu$(ne%) = se$ 'viimeinen osa split% = ne% 'kerrotaan montako löytyi End Function
Ei toimi vieläkään. Mielestäni kerran sain toimimaan kotona quickbasicilla koodatessa, mutta nyt olen 400-500km:n päässä Pohjois-Savossa ja minulla on nyt vain FreeBasic, koska Quickbasic 4.5:sta tai 7.1:stä ei löydy enään netistä oikein ollenkaan...
Tuo petrinm:n koodin pitäisi kyllä kääntyä uusimmalla FB:llä.
Oletkos installoinut sen kääntäjän oikein ja onko se myös se uusin versio?
En kokeillut kääntää mutta ainakin "silmissä käännöllä" sen pitäisi pelittää hyvin.
Olet installoinut kääntäjän oikein ja se on uusin versio, joka on saatavilla. Kyllä se kääntyy, mutta se ei silti toimi vielä oikein. Ei vaan pysty suorittamaan useaa komentoa kerrallaan eli jos mä laitan echo moi ; echo heh niin se näyttää vain ensinmäisen eli "moi".
Aihe on jo aika vanha, joten et voi enää vastata siihen.