Jak zadeklarować statyczne globalne rekurencyjnie zależne tablice?

Jak zadeklarować statyczne globalne rekurencyjnie zależne tablice?
twonek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2500
0

Dostałem dzisiaj taki kawałek kodu, który kiedyś (lata temu) się kompilował, a teraz niestety nie:

Kopiuj
struct state_str
{
    char *buf1;
    char *buf2;
    void (*routine)(char *);
    struct state_str *next_state;
};
typedef struct state_str STATE;

extern STATE init_state[];
extern STATE load_name[];

static STATE straight_comment[] = {
    {"\x01",          "\x7f",          NULL,                 straight_comment},
    {"\x0a",          "\x0a",          NULL,                 straight_comment},
    {END_STATE, "Invalid character in comment line", NULL, init_state}
};

static STATE init_state[] = {
    {"#",             "#",             NULL,                 straight_comment},
    {"(NAME,",        "(NAME,",        check_for_end,        load_name},
    {" ",             "~",             NULL,                 init_state},
    {"\x0a",          "\x0a",          NULL,                 init_state},
    {END_STATE, "Unknown start to line", NULL, init_state}
};

Komunikat błędu był mniej więcej taki:

Kopiuj
error: static declaration of ‘init_state’ follows non-static declaration
error: previous declaration of ‘init_state’ was here

Rozwiązałem problem kompilacji poprzez wywalenie static z definicji tych tablic, ale tak z czystej ciekawości zacząłem się zastanawiać czy da się inaczej, tak żeby zostawić te static?

satirev
  • Rejestracja: dni
  • Ostatnio: dni
1

Zamiast extern (bez -Wall i -pedantic) może zadziałać (jako UB ;p ):

Kopiuj
static STATE init_state[];

Rozwiązanie zagadki znajdziesz tutaj: https://groups.google.com/forum/#!topic/comp.lang.c.moderated/bmiF2xMz51U

MI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4
0

Po prostu, extern init_state[] informuje, że ta tablica została zadeklarowana gdzieś w innym pliku, a static, że jest ona lokalna dla pliku, więc te dwie rzeczy się wzajemnie wykluczają. Nawet jeżeli są jakieś sztuczki z kompilatorem pozwalajace to obejść, to mija się to z celem, gdyż powstałby dosyć nieczytelny kod.

KR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2520
0

Wywal static tutaj: static STATE straight_comment[].

Poza tym masz więcej błędów. Na przykladzie dlaczego to wyzej sie nie skompiluje:

Kopiuj
int a[] = {1,2,3};
int b[] = {a, 3}; // to sie zupelnym przypadkiem skompiluje, ale nie bedzie dzialac tak jak chcesz - sprawdz
twonek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2500
0
krwq napisał(a):

Wywal static tutaj: static STATE straight_comment[].
Tak też zrobiłem jak napisałem w pierwszym poście. Tyle że byłem ciekaw czy można mieć te tablice jako statyczne i jeśli nie to dlaczego.

Poza tym masz więcej błędów. Na przykladzie dlaczego to wyzej sie nie skompiluje:

Kopiuj
int[] a = {1,2,3};
int[] b = {a, 3}; // to sie zupelnym przypadkiem skompiluje, ale nie bedzie dzialac tak jak chcesz - sprawdz

To też się nie skompiluje :P Ale pomijając pomyłkę syntaktyczną to:

  1. Oczekuję, że b ma 2 wartości: wartość wskaźnika i numer 3. Kompilator zdaje się potwierdzić.
  2. W tamtym przykładzie oczekiwano wskaźnika i podano adres tablicy, a w Twoim przykładzie oczekujesz int i dajesz mu wskaźnik, więc nie widzę bezpośredniego powiązania. Chyba że coś przeoczyłem.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.