Nedávno jsem si během rekreačního programtvoření sesmolil prográmek, kterej seká koncovky. No, nic moc, ale jako příklad jak se v Éčku taky dá zacházet ze stringama je to dostatučující.
Základem tohodle progu je fce "dos.library" Rename(), jo jasně prostě si načtu z řádky řetězec vodpálím z něj koncovku a přejmenuju ho (na ten bez tý koncovky, samonoha). A protože mám na to náladu, tak si ještě nechám vypsat tu vodseklou část. Dál tenhle pokec pokračuje v sem šlehlým zdrojáku, kterej je v použitelným stavu (i přeloženej) v bonusu.
-> ************************************************ /* CUTPOS v2.0 - seká koncofky c BOLDA */ -> ************************************************ OPT OSVERSION=37 DEF myargs:PTR TO LONG,rdargs,soubor:PTR TO CHAR, celej:PTR TO CHAR, cesta, cilovej, -> celej názef cílovýho souboru (bez koncovky) velikost, -> velikost celý cesty + souboru vel -> velikost pouze názvu souboru PROC main() DEF koncovka -> abych si ji měl kam vrátit WriteF('[4m [1mCutPos 2.0[22m (14.07.98) [24m \n PUBLIC DOMAIN. naéčkoval BOLDA.... \n') myargs:=[0,0,0] IF rdargs:=ReadArgs('FILE/A,TIMES=T/N/K,PREFIX/S',myargs,NIL) /* zatím funguje jen první argument, i když původně měly i ty vostatní,ale lenost prudce zaútočila - tak snad jindy */ velikost:=StrLen(myargs[0]) -> Zjistím si velikost názvu souboru,ještě s ní bude prča celej := New(velikost+1) -> ARRAY string definovanej dynamicky.. AstrCopy(celej,myargs[0]) /* kvůli Rename(),je TO bezpečnější */ soubor := FilePart(celej) -> zjisti pointer v názvu vodkud začíná "soubor" -> za '/' nebo ':' vel:=StrLen(soubor) -> vel názvu souboru cesta:=String(1+velikost-vel) -> cesta musí bejt Estring cilovej:=String(velikost) -> dynamicky TO alokni MidStr(cesta,celej,0,velikost-vel) -> usekni začátek, do '/' nebo ':' IF koncovka:=sekacka() IF Rename(celej,cilovej) WriteF('Všechno KlapLo. Useklá koncovka: \s \n',koncovka) ELSE FreeArgs(rdargs) -> uvolni argumenty řádky WriteF('Nějak nefunguje rename.... existuje zdroj ? Nejni locklej ? \n') Dispose(celej) /* když sem si to aloknul,tak to taky po sobě uklidim... */ CleanUp(15) ENDIF ELSE WriteF('Vlastně žádnou koncovku ten soubor nemá. Nic sem aspoň nenašel. \n') ENDIF FreeArgs(rdargs) -> uvolni argumenty řádky ELSE WriteF('ŠPatný argumenty ! \n Zkus "CutPos ?" \n') CleanUp(20) ENDIF Dispose(celej) CleanUp(0) ENDPROC -> -> Tahle funkce vodvede tu sekací práci -> /* Funguje to tak,že se kontroluje řetězec vod PŘEDPOSLENÍHO znaku do PRVNÍHO a když se narazí na tečku,je jasný,že to je začítek koncofky */ PROC sekacka() DEF konc,dylka,useklej dylka:=vel-1 StrCopy(cilovej,cesta) /* vlož DO cílovýho strinGu cestu */ REPEAT IF soubor[dylka]="." konc:=String(2+dylka-(vel-dylka)) -> tak TO je síla,dynamika je prča useklej:=String(StrLen(soubor)-EstrLen(konc)) MidStr(konc,soubor,dylka,vel-dylka) MidStr(useklej,soubor,0,dylka) StrAdd(cilovej,useklej) /* přidej voseKlej soubor k cestě */ RETURN konc ENDIF DEC dylka UNTIL dylka=0 -> když je první . "tečka" nejni TO koncofka,takže klidně šlus na nule ENDPROC FALSE vers: CHAR '$VER: CutPos 2.0 (14.07.98) c BOLDA',0 -> version STRING
No, jak vidíš, žádnej řetězec se neDEFuje napevno. To je proto, že mi tím vodpadly starosti s dýlkou nazvu souboru (respektive pokud se to vejde do paměti, může CutPos zpracovávat dlouhý řetězce jak zrovna potřeba).
U Estringů je dynamická alokačka v klídku, u klasickejch ARRAYáků (0 končících) jsem musel šáhnout po New(), která mi pro proměnou dohodila nutnou paměť.
DOMA to RADĚJI nezkoušej! Co? Alokovat paměť a nevověřit si jestli to nebylo FALSE tak jako já při alokaci proměnný celej.
Pokud ti nejni jasnej rozdíl mezi ARRAYama a STRINGama v Éčku, tak už je celkem pochopitelný, že máš teď v palici jemně kořeněnej guláš. Spraví to spolehlivě E.guide nebo E.N.I.F.ův seriál, časem. Pokud ale všechno v tomhle článku totálně chápeš, tak to gratuluju, protože já teda už docela NE.........
BOLDA
AMIGA E - III.díl |
Vokecávky | Hardware | Warez | WBoviny | Dema | Gfx&Muz | Pařby | Vokecávky 2 |