DU5

Odpovědět
stana
Matfyz(ák|ačka) level I
Příspěvky: 7
Registrován: 16. 6. 2005 07:18

Příspěvek od stana »

johnny píše:

Kód: Vybrat vše

DUERR_TYPEMISMATCH,			    /**< type mismatch in a parameter passed by reference */
Tj. parametr předávaný odkazem, tj. řešit až v du6.
Na rozdil mezi DUERR_TYPEMISMATCH a DUERR_CANNOTCONVERT jsem psal na ulitu, a odpoved je: DUERR_TYPEMISMATCH se pouziva pouze jen a tehdy, pokud typ parametru predavaneho referenci neodpovida deklaraci funkce. Neshody u binarnich/unarnich operaci jsou DUERR_CANNOTCONVERT.
Uživatelský avatar
andree
Matfyz(ák|ačka) level III
Příspěvky: 106
Registrován: 9. 12. 2006 17:00
Typ studia: Informatika Mgr.
Kontaktovat uživatele:

Příspěvek od andree »

Kate píše: jeste by se mohlo nejak vysondovat, jak je to z tou konverzi real->integer u indexu pole (zda to je mozne nebo ne)
to by som povedal, ze nic specialne sa tu robit nebude.. sice dat real ako index pola je dobra prasacina, ale skonvertovat na int s warningom sa to da, takze...
Kate píše: a pak taky jestli zalezi na tom, jake hlasky budeme vypisovat, kdyz bude indexu u pole vic/min nez je rozmeru.
still a good question :-)
Pjotr
Matfyz(ák|ačka) level I
Příspěvky: 9
Registrován: 10. 12. 2006 23:04

Příspěvek od Pjotr »

Kate píše:jeste by se mohlo nejak vysondovat, jak je to z tou konverzi real->integer u indexu pole (zda to je mozne nebo ne)
Mne prijde ze to podle gramatiky jednoznacne neni povolene, protoze promenna typu pole se indexuje vyrazem ordinalniho typu. A ordinalni typ je integer nebo jeho cast (range)
Uživatelský avatar
andree
Matfyz(ák|ačka) level III
Příspěvky: 106
Registrován: 9. 12. 2006 17:00
Typ studia: Informatika Mgr.
Kontaktovat uživatele:

Příspěvek od andree »

hmm, tak nakoniec suhlasim s pjotrom - povolujem tam iba integer/range typ
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 »

rastik píše:
Anonymous píše:Ako to, ze sedia?

Kód: Vybrat vše

access_array()->element_type()->compute_size()
vrati stack unity ale LDLITI potrebuje ls_int_index.
(alebo ako presne sa tie typy volaju)
compute_size vrati konstantu a aby si ju mohol dostat na zasobnik cez LDLITI, tak ju do tabulky musis najprv pridat.
Jak se prida tedy velikost toho typu do tabulky?Diky
andreeeeeeee

Příspěvek od andreeeeeeee »

ctx->tab->ls_int()->add, alebo ako to bolo:) skratka rovnako ako pridavas do tabulky inty v lexikalnej analyze
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

Jak reagovat na přístup mimo pole?

Příspěvek od luk »

Můžu se zeptat, co udělat, když někdo přistoupí mimo meze pole?
Pochopil jsem správně, že tuhle situaci rozopznám až za běhu, že jo? :oops:

UPDATE: Ha, tak se omlouvám, konečně jsem si všimnul, že se to řeší o 5 stránek dřív :oops:
Hádám, že nic nového od té doby asi objeveno nebylo :D
Luk
Uživatelský avatar
pcv
Matfyz(ák|ačka) level I
Příspěvky: 25
Registrován: 13. 6. 2005 15:24
Typ studia: Informatika Mgr.
Bydliště: Praha
Kontaktovat uživatele:

podivne chovani funkce compute_size()

Příspěvek od pcv »

Narazil jsem na podivne chovani jejich fce compute_size() pri volani na range_type_pointer. V jejich kodu:

Kód: Vybrat vše

/// compute the size of the type
	/** the size is returned in stack units **/
	stack_address compute_size() const { return this ? compute_size_() : 0; }
	/// compute intermediate code physical type 
	/** returns the innermost element type for arrays

	    returns integer for range types
	**/
jsem vydedukoval, ze by to melo vratit velikost toho range, ale ouha. Na vstup:

Kód: Vybrat vše

var
  cislo:integer;  
  polele: array[1..6,1..5] of integer;
...
cislo:=polele[2,3];
To pri generovani kodu pro prvni dimenzi pole dela toto:

Kód: Vybrat vše

range_type_pointer rtp = ...;
int range_size = *( rtp->upperBound()) - *( rtp->lowerBound())+1;// ==6
int ble = rtp->compute_size();//==1
Je to bug, nebo jsem nepochopil ucel teto fce? :?
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:

Re: podivne chovani funkce compute_size()

Příspěvek od rastik »

pcv píše:Narazil jsem na podivne chovani jejich fce compute_size() pri volani na range_type_pointer.

Kód: Vybrat vše

var
  cislo:integer;  
  polele: array[1..6,1..5] of integer;
...
cislo:=polele[2,3];
To pri generovani kodu pro prvni dimenzi pole dela toto:

Kód: Vybrat vše

range_type_pointer rtp = ...;
int range_size = *( rtp->upperBound()) - *( rtp->lowerBound())+1;// ==6
int ble = rtp->compute_size();//==1
Je to bug, nebo jsem nepochopil ucel teto fce? :?
Ten rozsah vobec nemusis pocitat. Pointer na to spravne miesto sa pocita ako (2-1)*(a[]->compute_size)+(3-1). Teda compute_size zavolas ->access_array()->element_type()->compute_size(). Uz to tu raz bolo rozpisane.
Uživatelský avatar
pcv
Matfyz(ák|ačka) level I
Příspěvky: 25
Registrován: 13. 6. 2005 15:24
Typ studia: Informatika Mgr.
Bydliště: Praha
Kontaktovat uživatele:

Re: podivne chovani funkce compute_size()

Příspěvek od pcv »

rastik píše: Ten rozsah vobec nemusis pocitat. Pointer na to spravne miesto sa pocita ako (2-1)*(a[]->compute_size)+(3-1). Teda compute_size zavolas ->access_array()->element_type()->compute_size(). Uz to tu raz bolo rozpisane.
aha, ja to pocitam trochu jinak: nejdriv nasobim offset ktery uz mam velikosti posledniho range a pak pricitam (3-1), jako u Hornerova schematu na prevod ciselneho stringu na cislo. Do dvou rozmeru to dela uplne stejne, od tri vys se to bude pocitat jinak, ale vysledek by mel byt stejny.
Návštěvník

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

Ahoj, muzete mi prosim poradit jak zjistim typ pole? Nasel jsem jedine metodu

Kód: Vybrat vše

access_array()->compute_final_ptype()
ktera mi vraci typ

Kód: Vybrat vše

mlaskal::physical_type
ale nevim jetli je to spravne? dik
Uživatelský avatar
pcv
Matfyz(ák|ačka) level I
Příspěvky: 25
Registrován: 13. 6. 2005 15:24
Typ studia: Informatika Mgr.
Bydliště: Praha
Kontaktovat uživatele:

Příspěvek od pcv »

Anonymous píše:Ahoj, muzete mi prosim poradit jak zjistim typ pole? Nasel jsem jedine metodu

Kód: Vybrat vše

access_array()->compute_final_ptype()
ktera mi vraci typ

Kód: Vybrat vše

mlaskal::physical_type
ale nevim jetli je to spravne? dik

Kód: Vybrat vše

access_array()->element_type()->cat()
Návštěvník

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

pcv píše:
Anonymous píše:Ahoj, muzete mi prosim poradit jak zjistim typ pole? Nasel jsem jedine metodu

Kód: Vybrat vše

access_array()->compute_final_ptype()
ktera mi vraci typ

Kód: Vybrat vše

mlaskal::physical_type
ale nevim jetli je to spravne? dik

Kód: Vybrat vše

access_array()->element_type()->cat()
ja jsem ale myslel napr. array[1..6,2..9] of string; tak jak zjistim ten typ "string" ?
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 »

Anonymous píše: ja jsem ale myslel napr. array[1..6,2..9] of string; tak jak zjistim ten typ "string" ?
ono toto je to same co array[1..6] of array[2..9] of string.

takze se proste v nejakym cyklu posouvas po "array" tak dlouho, az jednou neni typ prvku pole array, ale je to ten posledni typ (tady string)
Člověk si nemusí nic myslet, aby něco udělal.
Tresko
Matfyz(ák|ačka) level I
Příspěvky: 28
Registrován: 9. 6. 2005 22:19

typ pola

Příspěvek od Tresko »

ja som pouzil takyto "trik" na zistenie typu pola:

Kód: Vybrat vše

if (...->access_array()->compute_final_ptype() == ctx->tab->logical_bool()->compute_final_ptype())....
8)
Odpovědět

Zpět na „2006“