C a promenne

Jakub Slajs xslajsj
Středa Březen 17 14:31:27 CET 2004


> Tak, tak, svata pravda. Taky se da napsat
> 
> a=*((short*)(c+i))

To se sice napsat da, ale znamena to neco uplne jineho ;-)
(Viz tez moje predchozi poznamka).

Pokud napisu:

  a=*((short*)(c+i));

tak indexuji v rozsahu charu.

Ovsem v pripade:

  a = ((short *)c)[i];

coz v pointerove aritmetice odpovida:

  a = *(((short *)c)+1);

tak indexuju v rozsahu shortu.

Napr.

    int a;
    char c[4];

    c[0] = 1;
    c[1] = 2;
    c[2] = 3;
    c[3] = 4;

    a = *((short*)(c+1));       770 = 3*256 + 2;
    a = ((short *)c)[1];        1027 = 4*256 + 3;

> Uz chapu, proc ma nekdo odpor k cecku...

Ja taky vzdyt ho tu poradne skoro nikdo neumi. Vcetne me pochopitelne. ;-))
Me se napriklad podarilo udelat nasledujici botu. Misto:

int *a = new int[10];

jsem nejakym nedopatrenim napsal:

int *a = new int(10);

tedy misto abych vytvoril pole deseti intu, tak se vytvoril jeden int ktery se
inicializoval na hodnotu 10. Ze pak clovek pristupoval mimo rozsah pole uz
snad ani nemusim dodavat. Nejhorsi ovsem bylo, ze z pocatku  vse fungovalo naprosto
korektne. Jak se program rozrustal tak to zrejme nekde zacalo prepisovat dulezita data
a cele to padalo. Je jasny ze clovek nejprve hleda chybu v tom kusu kodu ktery napsal
v dobe kdy to zaclo padat.

Nicmene v C++ neni problem si na pole napsat wrapper s pretypovanym operatorem []
a hlidat pripadne prekroceni rozsahu indexu (za cenu rychlosti ovsem).

C je velmi silny nastroj a pokud na nej presedlate s fichtla a myslite se ze vam
stavajici zkusenosti budou stacit, tak si brzo nabijete hubu ;-))))

J.S.

_________________________________________________________
Do You Yahoo!?
Get your free @yahoo.com address at http://mail.yahoo.com





Další informace o konferenci Hw-list