[ wiktor91 @ 12.01.2010. 22:35 ] @
Ovako, zanima me da li postoji mogučnost da se u C-u nekako napravi sljedeće.

Znači imam beskonačnu while petlju, u njoj for petlju koja ide od 1 do 7 a može iči u nekom slučaju i puno dalje, sa korakom od 1.
U toj for petlji je neka naredba recimo konkretno u mojem slučaju PORTB.Bx = 1;

E mene zanima kako ja mogu mjenjati taj 'x' ovisno o iteraciji u petlji bez da upotrebljavam switch petlju za svaki slučaj jer dok se radi o velikom broju ponavljanja switch petlja postaje stvarno preduga a ja sam ograničen malom ROM memorijom mikro kontrolera pa trebam efikasniji kod.

Ako nemože tako kako sam si ja zamislio da li postoji možda neki drugi način? Uglavnom bitno mi je da je kod što manji.
[ Mihajlo Cvetanović @ 13.01.2010. 09:07 ] @
Mnogo zavisi od toga kako izgleda "funkcija x". Jedno rešenje je if-else-if koji bi bio pametniji od switcha. Napiši objašnjenje šta x treba da bude u svakom od slučajeva.
[ wiktor91 @ 13.01.2010. 14:13 ] @
Evo otprilike ovako

Code:

while (1)
{
for ( int i = 0; i <= 7; i++)
{
 PORTB.Bi = 1; // inače bi to pisao bez for petlje i pisao bi za svaki slučaj PORTB.B1 = 1 pa onda PORTB.B2 = 1 i tako do PORTB.B=7
}
}


Znači trebalo bi se ovisno o 'i' mjenjati i bit kojemu pristupam tj. PORTB.B(i) tj. u prvom slučaju bi to bilo PORTB.B0, u drugom PORTB.B1 i tako dalje pa sve do PORTB.B7. Naravno da to mogu rješiti sa IFovima ali sam jako ograničen memorijom a trebam još napraviti podosta toga i neče mi stati u ROM ako ču se razbacivati tako sa memorijom.

[ Mihajlo Cvetanović @ 13.01.2010. 14:59 ] @
Ako je samo to onda je prosto. Treba ti samo niz pointera na članice (pointer to member variables). To su u suštini ofseti unutar strukture. Ako je data struktura

Code:

struct PORT
{
  int B1;
  int B2;
};

onda treba da napraviš pomoćni niz

Code:

int PORT::* niz[] = {&PORT::B1, &PORT::B2};

a onda članovima nekog objekta port tipa PORT sada možeš da pristupaš i sa port.*niz[x], gde je x jednako 0 ili 1. Na primer

Code:

for (int i = 0; i < 2; ++i)
  port.*niz[i] = 5 + i;

Po izvršenju ovog koda port.B1 će biti 5 a port.B2 će biti 6. Preduslov da ovo može da se kompajlira je da su B1 i B2 istog tipa (int).