Jak zadeklarować statyczne globalne rekurencyjnie zależne tablice?

Odpowiedz Nowy wątek
2015-02-19 18:33
0

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

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:

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?

Jak chcesz, aby nie były widoczne w innych TU to może spróbuj je zdefiniować w nienazwanej przestrzeni nazw? Nie jestem pewien czy to się z extern nie pogryzie, ale chyba nie powinno. - kq 2015-02-19 18:39
to jest kod w czystym C, i nie mam problemu z wywaleniem tych static, tylko tak się zastanawiam akademicko - twonek 2015-02-19 18:42
Aha, faktycznie, nie doczytałem tagów. - kq 2015-02-19 18:42

Pozostało 580 znaków

2015-02-19 20:04

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

static STATE init_state[];

Rozwiązanie zagadki znajdziesz tutaj: https://groups.google.com/for[...].lang.c.moderated/bmiF2xMz51U

edytowany 1x, ostatnio: satirev, 2015-02-19 20:05

Pozostało 580 znaków

2015-02-19 20:12
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.

Pozostało 580 znaków

2015-02-19 20:14
0

Wywal static tutaj: static STATE straight_comment[].

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

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

░█░█░█░█░█░█░█░█░█░█░█░
edytowany 2x, ostatnio: krwq, 2015-02-20 16:58
A od kiedy to klamry można przy typie pisać? (int [] tab) - mwl4 2015-02-20 16:49
przyzwyczajenie z C# - krwq 2015-02-20 16:58

Pozostało 580 znaków

2015-02-20 16:55
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:

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.

Racja, nie zauwazylem ze inicjalizujesz strukture i pominelem wzrokiem wewnetrzne klamry :P - krwq 2015-02-20 17:02

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0