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