Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 13 odgovora
  • 3.760 pregleda

Najnovija ↓

increment #define ili slično 19.05.2018. u 16:27 · pre 102 meseca #1
#define group 0

Recimo imam struct FOO
uint item;
uint group;

zatim imam array te struct, gde hoću da podelim zapise po grupama
const FOO foo[] = {
{.item = ... , .group = group}, // .group = 0
{.item = ... , .group = group}, // 0

group++;

{.item = ... , .group = group}, // 1
{.item = ... , .group = group}, // 1
{.item = ... , .group = group}, // 1

group++;

{.item = ... , .group = group}, // 2
{.item = ... , .group = group}, // 2
};

Ovo, naravno, ne može da se kompajlira, ali to je ono što mi treba.

Mogu .group da upisujem ručno, ali mogu pogrešiti.
Mogao bih da nekako prepravim struct i onda run-time upisujem grupu, ali onda neće biti const.

Znam da postoji __COUNTER__, ali koliko shvatam, to mi ne pomaže, counter bi se u ovom primeru završio na 6, umesto na 2.
Re: increment #define ili slično 19.05.2018. u 16:40 · pre 102 meseca #2
Ne mozes tako ni const ni non const. Nespecificirana dimenzija znaci da ce niz uzeti velicinu broja elemenata u inicijalizaciji.
Tebi zapravo treba nesto kao push_back kod vectora u C++. E sad kako C nema vektora, moraces sam to da implementiras
(ili da nadjes negde na internetu).
Re: increment #define ili slično 19.05.2018. u 16:41 · pre 102 meseca #3
#define je pretprocesorska direktiva. Bukvalno, pretprocesor radi MAKROZAMENU. Gde god da se pojavi "group" on stavi 0 umesto toga, pa se onda program kompajlira.
Tebi treba da je group varijabla, a ne makro.
Re: increment #define ili slično 19.05.2018. u 16:44 · pre 102 meseca #4
Uzgred, UVEK postavi sekvencu koda koja može da se kompajlira (ili javlja grešku kod kompajliranja). Ako ti javlja grešku, UVEK stavi poruku o grešci koju ti daje kompajler. Možda tebi poruka o grešci ne znači ništa, onima koji bi ti pomogli, verovatno dosta kaže.
Re: increment #define ili slično 19.05.2018. u 18:38 · pre 102 meseca #6
Ma vidim ja šta on pokušava. Ja pokušavam da mu kažem kako treba da radi - ako nešto ne može da se iskompajlira, napravi segment koda koji izoluje grešku, pa onda na njemu vežbaj. I ja tako radim, ako imam bag u segmentu od 1000 linija, pokušavam da napravim manji primer gde izdvojim sumnjivi deo koda, pa onda gledam šta se dešava, umesto da kompajliram ceo projekat.
Re: increment #define ili slično 19.05.2018. u 21:53 · pre 102 meseca #7
Da da. I da upotpunim temu, C/C++ makro nema ni petlju ni uslov niti mozes da pozivas rekurzivno sto bi bio jedan od preduslova da se ovo moze izvesti.
Re: increment #define ili slično 20.05.2018. u 09:33 · pre 102 meseca #8
Našao sam ovde zasad najbolje rešenje

tamo gde sam vam napisao group++ mogu da upišem

#undef group
#define group 1

pa na sledećem mestu

#undef group
#define group 2... itd

Nije perfektno, i dalje može da se pogreši, ali zasad meni najbolje.
Re: increment #define ili slično 20.05.2018. u 10:45 · pre 102 meseca #10
A da, ne može #define group, mora GROUP, jer isto ime ima i u strukturi, pa se kompajler buni.
Re: increment #define ili slično 20.05.2018. u 12:43 · pre 102 meseca #12
Umesto rešenja, bolje bi bilo da postavi problem, jer je očigledno da ne ume da ga pravilno definiše.
Re: increment #define ili slično 20.05.2018. u 12:56 · pre 102 meseca #13
Mislim da je ovo:
Code:

int main(void) {
    typedef struct { unsigned group; } Foo;
    const Foo foo[] = {
#undef Group
#define Group 0
        {.group = Group},
#undef Group
#define Group 1
        {.group = Group},
    };
}


E sad zasto je to bolje od toga da samo stavis .group = 0 , ... , .group = n, pitaj pisca ;)
Re: increment #define ili slično 20.05.2018. u 15:00 · pre 102 meseca #14
E upravo je to :)

A što se tiče zašto - ideja je bila da smanjim mogućnost greške,
npr. ako copy/paste iz jedne grupe u drugu, a zaboravim da promenim broj... ovako uvek piše isto.

Ali sad i nije bitno, shvatio sam da tabelu neću praviti ručno nego programski, pa neće biti greške.
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme