[LUGOS-PROG] checksum

Ales Casar casar at uni-mb.si
Sat Jun 29 15:47:53 CEST 2002


On Sat, 29 Jun 2002, Blaz Antonic wrote:

> Recimo da imam eno strukturo
>
> struct abc = {
> 	unsigned long var1;
> 	unsigned short var2;
> 	unsigned char var3[8];
> } * var_abc;

Si preprican, da tisti '=' ni tukaj prevec? Pa 'abc' se meni tudi zdi
odvec, ceprav napacen ni. No, odvisno...

> ki okupira 4 + 2 + 8 bajtov. Ce gledam nanjo drugace je na mestu, kamor
> kaze var_abc 7 zaporednih 16-bitnih (short) vrednosti. Recimo, da bi jih
> rad sestel skupaj (v checksum). Kako se tega lotim ?
>
> int i;
> unsigned short sum;
>
> for (i = 0; i < 7; i++)
> 	sum += (unsigned short) var_abc[i];
>
> ni pravi nacin, gcc se pritozuje in izpljune error. Alternatiuve, ki sem
> jih probal (in ne delajo) so

GCC se je cisto upraviceno pritozil. 'var_abc' je namrec kazalec na
strukturo. 'var_abc[i]' je potem tista struktura in tega ne mores kar tako
pretvoriti v nek povsem nekompatibilen tip (unsigned short). Da ne
omenjamo tega, kako bi cela stvar odpovedala ob zagonu programa. Ce se
program ze zrusil ne bi zaradi poskusa branja iz nedovoljenih lokacij
pomnilnika, bi ti pa vsaj skupaj sestel kaksno neumnost, ki je sigurno
noces.

V bistvu je problem v tem, da indeksiranje in typecasting pocnes v
napacnem vrstnem redu. Najprej moras najprej strukturi pretvoriti v polje
"unsigned short"-ov, potem se pa z indeksom sprehoditi preko njega in
sesteti posamezne elemente. Torej nekako takole:

      sum += ((unsigned short *) var_abc)[i];

> 	sum += (unsigned short *) var_abc[i];
>
> 	sum += (unsigned short *) var_abc + i;
>
> 	sum += (unsigned short) var_abc + i;
>
> Vsaj zdi se mi, da sem te kombinacije probal, gcc pa napise nekaj
> drugega (ampak se zmeraj ne dela).

Ojej! Clovek dobi obcutek, da ne ves, kaj posamezni gradnik pomeni, ampak
programiras kar tako s poskusanjem v stilu, ce bo delalo bo delalo, ce ne,
je pa kriv "neumni" prevajalnik, ki ni naredil tega, kar sem *hotel*, da
bi naredil (ampak je naredil to, kar sem mu *povedal*, da naj naredi).

> Probal sem tudi tako, da bi
>
> unsigned short * var_def[7];
>
> kazal na isto mesto kot var_abc, potem pa bi sesteval skupaj var_def[i].
> Afaik tudi to ne dela.

Pri tem pristopu bi pomagalo, ce bi oni '[7]' ven vrgel. S tem si namrec
definiral polje osmih kazalcev na unsigned short. Ti pa potrebujes polje
unsigned shortov. Oziroma bolje povedano samo kazalec na zacetek taksnega
polja, kateremu bos nato priredil vrednost var_abc-ja.

> Po nekaj eksperimentiranja (BTW, a kdo ve zaradi katerega debila je cel
> .dsl.siol.net domain banned na #linux ?) sem preprican, da mora biti

Zaradi tistega, ki se je odlocil deliti dinamicne IPje seveda.

> var_abc[7]) se vse prevede pravilno. K&R compiler se tukaj ne bi
> pritozeval (IMO), genijalni gcc pa se :( A se da gccju dopovedat naj ne
> sitnari in naj lepo sesteje tiste stvari skupaj, brez da moram jaz
> uvajat se eno strukturo (ali pa vsaj pointer, ki kaze na isto mesto) ?

Ja, no. Kot sem prej napovedal, da bo kriv "neumni" prevajalnik...

Ales

P.S.: Pa ne biti prevec jezen zaradi onega odstavka zgoraj. Verjetno vsi
      kdaj pa kdaj kaj programiramo tako s poskusanjem.

-- 
Ales Casar                |  Email:    casar at uni-mb.si
Computer Centre           |  DECnet:   RCUM::ALES
University of Maribor     |  AX.25:    S56SAC @ S50MBR.SVN.EU
SLOVENIA                  |  WWW:      http://www.el.feri.uni-mb.si/~ales/




More information about the lugos-prog mailing list