Predtermin 18.5.

Uživatelský avatar
twoflower
Supermatfyz(ák|ačka)
Příspěvky: 445
Registrován: 22. 9. 2004 21:07
Typ studia: Informatika Ph.D.
Kontaktovat uživatele:

Predtermin 18.5.

Příspěvek od twoflower »

Zadani bylo nasledujici:

Udelat skript chkform, ktery jako argument dostane jmeno ceckoveho zdrojaku. Ukolem je zkontrolovat, jestli uzivatel napsal vsechny printf a podobne funkce se spravnym poctem parametru, a jestli jsou spravneho typu. Seznam tech funkci, ktere mate hlidat, mate v konfiguracnim souboru, ktery vypada takto:

myprintf 3
dalsifunkce 0
ajestejedna 1

Cislo udava, kolik argumentu ma funkce jeste pred formatovacim retezcem. Jak to melo probihat - pokud jsem narazil na funkci kterou mam ohlidat, tak jsem musel kouknout do formatovaciho retezce a hlidat tyto sekvence:
%d, %g, %s, %*d, %*g, %*s a pak jeste direktivy tvaru %<cislo><typ>. Pokud nevite co znamena ta hvezdicka (jako treba ja :) ), tak to znamena, ze tato direktiva negeneruje jeden parametr prislusneho typu (int/float/char *), ale jeste jeden integer, ktery udava sirku vystupu.

Cili spravne volani:

Kód: Vybrat vše

myprintf("Blabla %s %*d", "neco",  delka, cislo);
A co mel nas skriptik vlastne delat? Mel nahradit vyskyt jmen tech hlidanych funkci jmenem tvaru __<puvodni jmeno>__<suffix>, kde <suffix> je posloupnost znaku d, g, s, podle toho co jsme nasli ve formatovacim retezci. Dale odstranit formatovaci retezec a nechat jen ty dalsi parametry.

Z kodu

Kód: Vybrat vše

myprintf("Blabla %s %*d", "neco",  delka, cislo);
jsme tak meli udelat

Kód: Vybrat vše

__myprintf__sdd("neco", delka, cislo);
Pokud by v konfiguracnim souboru u myprintf bylo treba cislo 4, puvodni kod by vypadal nejak takhle:

Kód: Vybrat vše

myprintf(neco, dalsi, jeste, posledni, "Blabla %s %*d", "neco", delka, cislo);
Vystupem melo byt to same jako v predchozim pripade.

Jak jiste tusite, cilem bylo, abychom predlozili prekladaci zdrojak v takove forme, kdy uz nam dokaze rict, ze pocet parametru/jejich typ je spatne. K tomu je ovsem jeste treba vygenerovat deklarace funkci.

Takze dalsi vec co musel skript vypsat (nekam do jineho souboru, ktery se do toho zdrojaku potom naincludoval)

Kód: Vybrat vše

void __myprintf__sdd(char *, int, int);
Zaludnosti:
- funkce muze byt roztazena pres vic radku
- retezec muze vypadat i takhle:
"afasdad" "adsad"
- pozor na \", %%, \\ apod. v retezcich

Snad jsem na nic nezapomnel.

Bylo nas tam 17,
2 tusim odesli behem pisemky,
2 to dostali rovnou
4 sli na ustni
zbytek to nedostal.
Odpovědět

Zpět na „2004“