logo

Cvičme v ritme - v algoritme !



Vítám Vás u dalšího dílu tohodle seriálku. Dneska budu hóóóódně stručnej, protože lenost (znáte to...  :-ú). Připravil jsem si pro Vás dva ukázkový algoritmy, který jsou sice celkem jednoduchý, ale určitě se Vám někdy hoděj. První se na paškál dostala rutinka, která brutálním způsobem otestuje, je-li určenej soubor iffovej sampl (zvuk). Jako druhou jsem zařadil o něco užitečnější věcičku - rutinku, ježto vám z řetězce obsahujícího název souboru + cestu k němu vypreparuje název právě toho souboru (např. "Work:shity/PC/Bill.txt" a výsledek "Bill.txt").

Well, zde je tedy ta první slibovaná. Jak jsem už naznačil, jedná se o rutinku, která otestuje, zda je daný soubor IFF 8SVX sampl. Vzniklo to proto, že Blitz při nahrávání samplů (příkaz LoadSound) vyžaduje právě iffový zvuky, ale vůbec si je neotestuje. Nahrajete-li LoadSoundem něco jinýho, než je IFF 8SVX sampl, dočkáte se tak akorát guráče! Zrovna tak dopadnete, pokusíte-li se nahrát IFF delší než 128KB.

  Neručím za to, že to nejde udělat líp, ale funguje to. Funkce ChSample dostane jako vstup řetězec s cestou a názvem souboru a vyplivne, zda je to IFF sampl (0=ne,  1=ano).

Function.b ChSample{f.s} ;začátek funkce (f.s je řetězcovej parametr)
If ReadFile(1,f)         ; pokus o otevření souboru ke čtení
  FileInput 1            ; podaří-li se, tak na něj přesměrujeme vstupy
  s.s=Edit$(16)          ; načteme prvních 16 znaků
  ; a otestujeme, jsou-li první čtyři znaky FORM, znaky 9-15 8SVXVHDR a
  ; není-li délka souboru větší než 128000 bajtů.
  If Mid$(s,0,4)="FORM" AND Mid$(s,9,15)="8SVXVHDR" AND Lof(1)<128000
    WindowInput #w0   ; je-li vše v pořádku - vstupy přesm. do okna
    CloseFile 1       ; zavřeme soubor pro čtení (viz ReadFile(1,f))
    Function Return 1 ; funkce vrátí 1 = úspěch
  Else                ; něco špatně...
    WindowInput #w0   ; vstupy přesměrovat do okna #w0 (to je kód okna)
    CloseFile 1       ; zavřem soubor
    Function Return 0 ; vrácená hodnota 0 = neúspěch
  End If              ; konec bloku If
End If                ; další If skončil
WindowInput #w0       ; sichr - vstupy vrátit oknu
End Function          ; konec funkce

Pochopili ? Fajn, jdem na další:

Function.s PrintName{vstup.s} ; vstup=řetezec k prohledání (.s = budeme vracet
                              ; řetězec)
le.l=Len(vstup)               ; zjistíme délku řetězce
If le=0                       ; je-li nulová
  prt.s="NO SAMPLE LOADED"    ; vrátíma hlášku "Nenahrán žádný soubor"
End If                        ; konec podmínky
le=le+1                       ; index potřebný pro cyklus
x.l=1                         ; aktuální pozice v řetězci
poz.l=-1                  ; misto, kde bylo nalezeno "/", nebo ":"
While x<le                    ; dokud neni konec řetězce
  If Mid$(vstup,x,1)="/" OR Mid$(vstup,x,1)=":"  ; nalezeno ?
    poz=x                                        ; ulož pozici nalez. znaku
  End If
  x=x+1                                          ; posunem se na další znak
Wend
If poz=-1                                        ; nenalezeno !
  prt.s=Mid$(vstup,1,23)   ; vrať prvních 23 znaků ze vstup
                     ; (23 se dá změnit a nic se nestane - tak jsem to
                     ; potřeboval já)
Else                 ; jinak se vrátí konec řetězce vstup od poz+1
  prt.s=Mid$(vstup,poz+1,23)  ; jinak vrať jen název souboru
End If                        ; konec If
Function Return prt           ; vrátíme řetězec prt
End Function                  ; konec funkce

  Docela slušný hrátky s řetězcema, co? Myslim si, že snadno pochopíte jak to všechno Funguje. Je sobota 10:25 ráno a já končim dnešní seanci. Snad už příště dovalim něco, co se Vám bude hodit kapku víc... ;-).

 
Auf Wiedersehen!

E.N.I.F.          

 
          Ehmr,ascii výpisy (použitelný v BB2) vobou fcí se povalujou v "bonus"u  
__________________________________________

. Zpátky do Obsahu