DU6

Odpovědět
Návštěvník

Re: Špatný posun instrukcí

Příspěvek od Návštěvník »

Andrej píše:

Kód: Vybrat vše

|	
DUTOK_REPEAT command_list DUTOK_UNTIL expression
    {
        if ( identical_type( $4.cur_type, ctx->tab->logical_bool() ) ) {
            $$.icb = $2.icb;
            icblock_append_delete( $$.icb, $4.icb );
            $$.icb->append_instruction( new ai::JF( $$.icb->begin() ) );
        } else {
            error( DUERR_TYPEMISMATCH, @4 );
            $$.icb = $2.icb;
        }
    }
zkusila jsem test a muj vystup je spravny (target=26). sice muj kod (moji vinou) vypada jinak, ale myslim, ze by to melo fungovat nejak takto:

Kód: Vybrat vše

ic_label il = new_label(ctx);
$$.icb->add_label(il); // pridas do kodu misto pro skok 
mlc::icblock_append_delete($$.icb, $2.icb);	// prikazy
mlc::icblock_append_delete($$.icb, $4.icb); // podminka
$$.icb->append_instruction_with_target(new ai::JF($$.icb->end()),il); // pri false vyhodnoceni skok na il
Uživatelský avatar
Kate
Matfyz(ák|ačka) level III
Příspěvky: 146
Registrován: 8. 1. 2005 10:52
Typ studia: Informatika Mgr.
Bydliště: Milada squat
Kontaktovat uživatele:

Příspěvek od Kate »

to predtim jsem byla ja - zase me to automaticky neprihlasilo :(. jinak kod, ktery jsem napsala pak dava toto (coz bych povazovala za spravne - je to vlastne stejne az na ten skok):

Kód: Vybrat vše

BADOFFSETTEST:
20:	INITI
21:	INITI
22:	LDLITI	LITINT[1]
23:	GSTI	[0]
24:	LDLITI	LITINT[2]
25:	GSTI	[1]
26:	GLDI	[0]
27:	LDLITI	LITINT[0]
28:	SUBI
29:	GSTI	[0]
30:	GLDI	[0]
31:	GLDI	[1]
32:	LTI
33:	JF	-7	;; target=26
34:	DTORI
35:	DTORI
36:	HALT

tak a jeste by mi mohl nekdo hodny poradit, jak dostat v posledni verzi chybovou hlasku "Expression may not be passed by reference", pro kterou si myslim, ze neexistuje kod (nenasla jsem), ale evidentne je to potreba hlasit pro pripady jako v test11:
http://nulita.ms.mff.cuni.cz/pub/predn/ ... 1.mls.html

ocekavany vystup: > Error (line 12): Expression may not be passed by reference
Člověk si nemusí nic myslet, aby něco udělal.
Uživatelský avatar
rastik
Supermatfyz(ák|ačka)
Příspěvky: 661
Registrován: 19. 10. 2005 21:45
Typ studia: Informatika Mgr.
Bydliště: Praha
Kontaktovat uživatele:

Příspěvek od rastik »

Kate píše:tak a jeste by mi mohl nekdo hodny poradit, jak dostat v posledni verzi chybovou hlasku "Expression may not be passed by reference", pro kterou si myslim, ze neexistuje kod (nenasla jsem), ale evidentne je to potreba hlasit pro pripady jako v test11:
http://nulita.ms.mff.cuni.cz/pub/predn/ ... 1.mls.html

ocekavany vystup: > Error (line 12): Expression may not be passed by reference
Tak vyzera, ze to ulita v novej verzii opravila.
Uživatelský avatar
Andrej
Matfyz(ák|ačka) level I
Příspěvky: 47
Registrován: 15. 9. 2006 17:08
Typ studia: Informatika Mgr.
Bydliště: Zlín
Kontaktovat uživatele:

Re: Špatný posun instrukcí

Příspěvek od Andrej »

Kate píše:zkusila jsem test a muj vystup je spravny (target=26). sice muj kod (moji vinou) vypada jinak, ale myslim, ze by to melo fungovat nejak takto:

Kód: Vybrat vše

ic_label il = new_label(ctx);
$$.icb->add_label(il); // pridas do kodu misto pro skok 
mlc::icblock_append_delete($$.icb, $2.icb);	// prikazy
mlc::icblock_append_delete($$.icb, $4.icb); // podminka
$$.icb->append_instruction_with_target(new ai::JF($$.icb->end()),il); // pri false vyhodnoceni skok na il
A hoplá! Moc díky, že jsi to zkusila. Tím se úplně mění moje představa o vytváření skoků. Teprve teď jsem pochopil, že se musí skoky řešit pomocí labelů. Naivně jsem se domníval, že se jen iterátorem ukáže na instrukci... Pak je jasné, proč mi to nefunguje. Nicméně význam těch iterátorů a důvod jejich předávání do konstruktorů JT/JF/JMP zůstává záhadou.
t2
Matfyz(ák|ačka) level I
Příspěvky: 49
Registrován: 22. 1. 2006 15:19

Re: Špatný posun instrukcí

Příspěvek od t2 »

Andrej píše:Nicméně význam těch iterátorů a důvod jejich předávání do konstruktorů JT/JF/JMP zůstává záhadou.
Nie som si tym uplne isty, ale ten iterator, co sa dava do konstruktora instrukcii skoku, sluzi na to, aby ta instrukcia vedela, kde je jej miesto v icblocku. Potom na zaklade toho iteratora a toho labela, co je ako dalsi parameter, spocita relativnu adresu skoku. (z toho vyplyva, ze prakticky sa tam vzdy dava iterator end() icblocku do ktoreho ju prave pridavas).
Leli
Matfyz(ák|ačka) level I
Příspěvky: 29
Registrován: 2. 2. 2006 13:07
Typ studia: Informatika Bc.
Bydliště: Pilsen
Kontaktovat uživatele:

Příspěvek od Leli »

Ahoj, resili uz jste nekdo kopirovani neuplnych poli? Nerikal nekdo na cvicenich, jak to provadet? Diky
Uživatelský avatar
luk
Matfyz(ák|ačka) level II
Příspěvky: 74
Registrován: 6. 6. 2005 18:32
Typ studia: Informatika Mgr.
Bydliště: Praha

Příspěvek od luk »

Leli píše:Ahoj, resili uz jste nekdo kopirovani neuplnych poli? Nerikal nekdo na cvicenich, jak to provadet? Diky
Zdravím! Nám o tom Bednárek na cvikách nic neříkal a mám dojem, že to ani snad řešit nemáme...Pokud myslíš kopírováním neúplných polí třeba tohle:

Kód: Vybrat vše

type Pole = Array[1..2,2..4] of Integer;

var A,B:Pole;
     I:Integer;

begin
     for I := 2 to 4
          A[1] := I;
     B := A;
end.
Tak mám dojem (a pevně v to doufám :evil: ), že je to záležitost grafu životnosti proměnných a to je snad až o fázi dál, než končí náš úkol. Rozhodně jsem to s touhle vírou odevzdal, tak snad jsem se nespletl :roll:
Luk
Leli
Matfyz(ák|ačka) level I
Příspěvky: 29
Registrován: 2. 2. 2006 13:07
Typ studia: Informatika Bc.
Bydliště: Pilsen
Kontaktovat uživatele:

Příspěvek od Leli »

No spis treba tohle

Kód: Vybrat vše

type Pole = Array[1..2,2..4] of Integer;

var A,B:Pole;
     I:Integer;

begin
     for I := 2 to 4
          A[1] := B[2];

end.
Neuplne pole bylo mysleno, tak ze nejsou zadany vsechny rozmery, takze pri kopirovani se nekopiruje jenom jedna hodnota, ale nekolik hodnot za sebou v pameti.
Uživatelský avatar
BB
Matfyz(ák|ačka) level I
Příspěvky: 10
Registrován: 9. 2. 2006 00:21
Typ studia: Informatika Bc.
Bydliště: Jizni.mesto/Otava/617.B
Kontaktovat uživatele:

Příspěvek od BB »

Leli píše:Ahoj, resili uz jste nekdo kopirovani neuplnych poli? Nerikal nekdo na cvicenich, jak to provadet? Diky
Ano, řešil jsem to. Není to takový problém, jak to vypadá. Nejhorší je typová kontrola, ale zbytek je stejný jako u kopírování celých polí, tak nevidím důvod proč to neimplementovat.
Uživatelský avatar
luk
Matfyz(ák|ačka) level II
Příspěvky: 74
Registrován: 6. 6. 2005 18:32
Typ studia: Informatika Mgr.
Bydliště: Praha

Příspěvek od luk »

Leli píše:No spis treba tohle

Kód: Vybrat vše

type Pole = Array[1..2,2..4] of Integer;

var A,B:Pole;
     I:Integer;

begin
     for I := 2 to 4
          A[1] := B[2];

end.
Neuplne pole bylo mysleno, tak ze nejsou zadany vsechny rozmery, takze pri kopirovani se nekopiruje jenom jedna hodnota, ale nekolik hodnot za sebou v pameti.
Jo aha, tak to jo, to jsem řešil a není to nic strašného :)
Luk
Leli
Matfyz(ák|ačka) level I
Příspěvky: 29
Registrován: 2. 2. 2006 13:07
Typ studia: Informatika Bc.
Bydliště: Pilsen
Kontaktovat uživatele:

Příspěvek od Leli »

Porad mi to neni jasne. Mam dva icblocky, ktere mi hodi na zasobnik ukazatel na pocatecni pozici, odkud/kam budu kopirovat. Ale jak pak provest kopirovani? Kdyz neumim duplikovat bloky, tak dovedu zkopirovat jen jeden prvek a pak ztratim ukazatele, protoze je XLD* a XST* sezerou.dik
Uživatelský avatar
Tuetschek
Supermatfyz(ák|ačka)
Příspěvky: 657
Registrován: 15. 6. 2005 13:54
Typ studia: Nestuduji ale učím na MFF
Kontaktovat uživatele:

Příspěvek od Tuetschek »

Leli píše:Porad mi to neni jasne. Mam dva icblocky, ktere mi hodi na zasobnik ukazatel na pocatecni pozici, odkud/kam budu kopirovat. Ale jak pak provest kopirovani? Kdyz neumim duplikovat bloky, tak dovedu zkopirovat jen jeden prvek a pak ztratim ukazatele, protoze je XLD* a XST* sezerou.dik
No ale muzes duplikovat ty pointry a mas instrukce SST* ktery dovedou ukladat i na misto kde byl puvodne jiny datovy typ. Aspon takhle jsem to pochopil z du6-test1.moa a funkce addvi -- tam je pekne videt nahrani pole pres pointer na stack.
Kopirovani pole je delany tak ze ho nejdriv cely nahazis na stack a pak pozpatku cely ulozis -- po jednom prvku by to asi bylo slozitejsi, tohle je doufam legalni.
Akorat mi stve to ukladani ... ja to nejak vymyslel, jeste jsem to netestoval, ale vadi mi ze tam musim ten pointer cpat na zasobnik vickrat a pak ho jednou rusit DTOR-em ... mate to nekdo bez toho?

Opravte me jestli to jde nejak lip a jinak nebo jsem prohlasil nejakou blbost, prosim :? ...

EDIT: Tak jsem jednu blbost uz prohlasil, to ukladani poli ze zasobniku nekam pres referenci jde i bez DTORu.
Plug 'n' Pray.
miso02
Matfyz(ák|ačka) level I
Příspěvky: 16
Registrován: 12. 2. 2006 19:58

Mensie nejasnosti...

Příspěvek od miso02 »

Zdravim! Viem, ze na podobnu temu uz je na fore pridanych par prispevkov, ale stale si s niecim neviem rady:( Niketore veci su mozno trivialne, ale rad by som sa v nich uistil:)

Tak tu su moje otazky:

1.Ak mam deklarovany label v hlavnom programe(alebo ho nemam deklarovany vobec) a v kode podprogramu(programu)
mam navestie (napr 1: ), ktore nie je deklarovane ani v danom podprograme, tak cely program odleti.
label_symbol_pointer lsp = ctx->tab->find_label(ls_int_index) nam v takomto pripade vrati lsp, ktory ma hodnotu NULL.
Ak pouzijem funkciu lsp->label_found(Line), tak nam na tomto riadku program spadne.
Ako mam zistit ze lsp == NULL ? Ake errory by bolo vhodne vyhadzovat?
2.Ak mam deklarovany label v hlavnom programe(alebo ho nemam deklarovany vobec) a v kode podprogramu(programu)
mam prikaz goto (napr goto 1; a nikde v kode nie je navestie 1: ), ktoreho label nie je deklarovany ani v danom podprograme, tak cely program odleti.
label_symbol_pointer lsp = ctx->tab->find_label(ls_int_index) nam v takomto pripade vrati lsp, ktory ma hodnotu NULL.
Ak pouzijem funkciu lsp->goto_found(Line), tak nam na tomto riadku program spadne.
Ako mam zistit ze lsp == NULL ? Ake errory by bolo vhodne vyhadzovat?
3.Ake errory mam vyhadzovat ak podmienkovy vyraz v prikazoch ako while, if-then-else a repeat-until nie je typu bool (DUERR_CANNOTCONVER?)
4.Len, aby som sa uistil operatory AND, OR, NOT mozu pracovat len s operandami typu bool?

Za pomoc dakujem:)

Ps: Prve dve problemy pretrvavaju aj napriek tomu, ze pracujem s najnovsim projektom.
Uživatelský avatar
luk
Matfyz(ák|ačka) level II
Příspěvky: 74
Registrován: 6. 6. 2005 18:32
Typ studia: Informatika Mgr.
Bydliště: Praha

Re: Mensie nejasnosti...

Příspěvek od luk »

miso02 píše:Zdravim! Viem, ze na podobnu temu uz je na fore pridanych par prispevkov, ale stale si s niecim neviem rady:( Niketore veci su mozno trivialne, ale rad by som sa v nich uistil:)
Zdravím! :)

Tak mé rady jsou:
1. Že lsp je null zjistíš pomocí jeho operátoru !, zkrátka otestuješ

Kód: Vybrat vše

if (!lsp)
   mlc::error(...
Pro tenhle případ je tam chyba DUERR_NOTLABEL
2. Tady je to totéže, pokud label vůbec nebyl deklarovaný (lsp == null) a jinak normálně zavolej goto_found, o zbytek se postarají tabulky symbolů.
3. Nejspíš, žádnou lepší jsem taky nenašel
4. Jo jo, když se podíváš do popisu instrukcí AND a OR, tak ony ani jiné operandy neumějí

Nevím, jestli to byly rady nad zlato, ale snad byly alespoň dobré :)
Hodně štěstí a pevné nervy při psaní mlc :wink:
Luk
Návštěvník

Příspěvek od Návštěvník »

Mimochodem, nevíte někdo, který den v týdnu uliťáci opravují úlohy?
Měl jsem dojem, že říkali pondělí, ale můj úkol tam visí od neděle a neděje se nic :(
Odpovědět

Zpět na „2006“