[ aleksazr @ 19.05.2018. 15:27 ] @
#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.
[ Branimir Maksimovic @ 19.05.2018. 15:40 ] @
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).
[ djoka_l @ 19.05.2018. 15:41 ] @
#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.
[ djoka_l @ 19.05.2018. 15:44 ] @
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.
[ Branimir Maksimovic @ 19.05.2018. 15:59 ] @
On pokusava da izgenerise array[] = { {...,.group=1} ... , {...,.group=n}};
ali C preprocesor ne podrzava macro varijable.
[ djoka_l @ 19.05.2018. 17:38 ] @
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.
[ Branimir Maksimovic @ 19.05.2018. 20:53 ] @
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.
[ aleksazr @ 20.05.2018. 08:33 ] @
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.
[ Bradzorf012 @ 20.05.2018. 08:55 ] @
Možda je to tebi najbolje i možda to radi, ali to nije rešenje.
[ aleksazr @ 20.05.2018. 09:45 ] @
A da, ne može #define group, mora GROUP, jer isto ime ima i u strukturi, pa se kompajler buni.
[ Branimir Maksimovic @ 20.05.2018. 11:22 ] @
Jel mozes da posaljes celo resenje kako bih naucio kako se ovo radi ;)
Koliko znam #define #undef ne mozes da ubacis u makro.
[ Bradzorf012 @ 20.05.2018. 11:43 ] @
Umesto rešenja, bolje bi bilo da postavi problem, jer je očigledno da ne ume da ga pravilno definiše.
[ Branimir Maksimovic @ 20.05.2018. 11:56 ] @
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 ;)
[ aleksazr @ 20.05.2018. 14:00 ] @
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.