Pole v C
Lukáš Grepl
L.Grepl@sh.cvut.cz
Středa Listopad 26 14:25:59 CET 2008
> Toto nefunguje:
>
> for(uint8_t i=0; i<((*m).e_arr_len-1);i++)
> (*m).e[i] = (*m).e[i+1];
Na první pohled to vypadá, že by to principiálně fungovat mohlo. Určitě
máte v tom m a m->e_arr_len to, co předpokládáte?
> A toto ano:
>
> (*m).e[0] = (*m).e[1];
> (*m).e[1] = (*m).e[2];
> (*m).e[2] = (*m).e[3];
> (*m).e[4] = ((*m).req_speed - (*m).act_speed);
>
> Samozřejmě bych radši používal for, protože je to čistší a navíc chci to
> pole alokovat dynamicky. Ale ať na to koukám, jak na to koukám, chybu
> nevidím. Kompilátorem to projde, ale bohužel to nefunguje.
Pro čtyři položky je to asi skoro jedno, ale obvykle bývá efektivnější
místo přerovnávání a sčítání celého pole napsat klouzavý průměr
přibližně takto:
int update_moving_average(int value)
{
static int acc, buffer[N], i;
acc = acc - buffer[i] + value;
buffer[i] = value;
if (++i >= N)
i = 0;
return acc; // nebo acc/N podle potřeby
}
Lukáš Grepl
Další informace o konferenci Hw-list