Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Apuva! *QB/FB*

Sivun loppuun

juhaz [23.06.2005 13:40:03]

#

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.

E.K.Virtanen [23.06.2005 16:24:12]

#

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))

juhaz [23.06.2005 16:49:44]

#

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.

petrinm [23.06.2005 17:12:58]

#

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

juhaz [23.06.2005 21:50:31]

#

Öh... meikä ei nyt ihan tajunnut? :D
Viitsitkö laittaa esimerkkikoodin niin jos ymmärtäis mitä tarkoitit...

petrinm [24.06.2005 10:07:55]

#

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

juhaz [24.06.2005 11:09:47]

#

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...

E.K.Virtanen [24.06.2005 11:33:45]

#

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.

juhaz [24.06.2005 11:35:44]

#

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".


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta