«« ( Date ) »» // «« ( Thread ) »» // ri4pp - 2005

Re: Par Pitanja DZ3

by lilit78yu
sreda, 04. maj 2005 - 18:09.

Naravno. Medjutim, mislim da i u slucaju greske u opsegu formalnih parametara treba ubaciti neki Obj( koji god - treba samo da oznacava neku gresku ), inace se gubi broj parametara iz deklaracije ( ovo nije potrebno za MJ, jer ne postoji overload). Ipak mislim da iako postoji greska u deklaraciji tipa
void met(char c, int c, char c, pera zika){}
u TS ipak treba da se ubaci metoda koja ima 4 formalna parametra. Ovo je samo pitanje pojedinacne izvedbe :))
DA ali mozes da izvrsis akciju upisa u level kada se zavrsi opseg
formalnih parametara. Mada sam ja za to uveo posebnu pomocnu prom.
U svakom slucaju, nisam mislio na to, vec da proveru da li je objekat
ubacen mozes da vrsis ispitivanjem nVars_a. Zapamtis vrednost u lokalnu
int prom n, uradis insert (...) i proveris da li se vrednost nVars
povecala za 1 u odnosu na n. Tako znas da li je insert ovavljen uspesno
ili vec postoji objekat sa istim imenom (tada se nece promeniti nVars). Na
taj nacin ne moras da proveravas povratni tip i menjas metodu Tab.inster
(...)
Pazi! nVars predstavlja ukupan broj parametara, a level treba da
predstavlja
broj formalnih parametara !
Klasa Scope ima i atribut nVars (broj polja u tom opsegu), koji metoda
Tab.insert inkrementira kada uspesno ubaci novi objekat!
Iskoristi to.
>Pri deklaraciji metoda moze se desiti da se pojavi ponovljena
deklaracija.
int error(int x, char c, char c){...}

Nisam bas siguran da je gornja situacija korektna. Kako sada ta tvoja
f-ja da
razlikuje koju od promenljivih u ovom slucaju C adresiras? Ja mislim
da
je
potrebno da se u definiciji f-je pojave sve razlicite promenljive, a
tek
pri
pozivu one mogu biti iste tj. ako bi se gornja f-ja pozvala sa int i =
error
(x,c,c) sve bi trebalo da funkcionise.

Naravno, ovo jeste nekorektna deklaracija, medjutim, nije problem u
tome
da
li je ovo ispravno ili ne ! Problem je u tome sto pri pokusaju da se
ubaci
CHAR C drugi put u TOPSCOPE.locals, metoda TAB.INSERT vraca upravo onaj
prvi
CHAR C, koji je vec u TOPSCOPE.locals . Na osnovu ovoga, ne moze da se
'provali' da li je drugi CHAR C uspesno ili ne ubacen u TS.locals .
Pogledaj
ovo :
public static Obj insert (int kind, String name, Struct type) {
// check for duplicate
for (Obj p = topScope.locals; p != null; p = p.next)
if (p.name.equals(name)) {
error(name + " already declared");
return p;
}
....
Dakle, pokusavas da u TS.locals drugi put ubacis CHAR C. Posto se ovaj
Obj
vec nalazi u TS.locals, TAB.INSERT vraca pronadjeni Obj CHAR C ( prvi
) i
kada u parseru pokusas da ih uporedis ( da bi znao da li je uspesno
ubacen,
obzirom da tekstualna poruka o gresci za parser ne znaci nista ), sa
recimo,
Obj1.equals(Tab.insert(Obj1.kind,Obj1.name,Obj1.type) --> dobijes
jednakost
iako operacija nije uspela. ( Ako je operacija uspesna vraca se ubaceni
Obj
)---> Dakle u oba slucaja se dobije jednakost....
Da li mesto (return p) u Tab.insert staviti (return noObj) i tako
promeniti
clasu Tab?... To je bilo pitanje.