Strona 1 z 1

Re: [VisualGDB]initializer element is not constan

: środa 16 sie 2017, 13:14
autor: Antystatyczny
To pewnie nie ma znaczenia (a właściwie nigdy się nad tym nie zastanawiałem), ale czy próbowałeś napisać const int NONE = -1;?

Re: [VisualGDB]initializer element is not constan

: środa 16 sie 2017, 14:00
autor: xor
NONE to jak dla mnie zmienna. Co prawda nie można zmienić jej wartości w programie (przeważnie), albo nawet umieszczona we FLASH, ale istniejąca jako obiekt w (jakiejś) pamięci (sprawdź sobie w pliku .map czy ma przydzieloną pamięć i gdzie).
Stała to by było

Kod: Zaznacz cały

static int buffered_char = -1;


albo

Kod: Zaznacz cały

#define NONE -1
static int buffered_char = NONE;

Re: [VisualGDB]initializer element is not constan

: środa 16 sie 2017, 16:36
autor: Antystatyczny
xor pisze:Stała to by było

Kod: Zaznacz cały

  static int buffered_char = -1;

albo

Kod: Zaznacz cały

#define NONE -1
static int buffered_char = NONE;



Przedyskutujmy to jeszcze. W mojej ocenie static int buffered_char = NONE; nadal jest zmienną, oczywiście jest zainicjalizowana wartością -1 i jest o widoczności wewnętrznej (zasięg jednego modułu). Gdybym chciał mieć faktyczną stałą, napisałbym tak:

Kod: Zaznacz cały

static const int buffered_char = -1;


A co do makra... Zaleca się ograniczanie ich ilości, a tutaj właśnie można z niego (makra) zrezygnować, ponieważ brałoby udział w inicjalizacji stałej. W dalszej części kodu posługujemy się już nazwą "buffered_char", czyli nie wprowadzamy do niego tzw. magicznych liczb (co również nie jest zalecane).

Oczywiście mogę się mylić. Być może stała NONE ma być wykorzystywana wielokrotnie, ale do analizy mam tylko dwie linijki kodu :)

Re: [VisualGDB]initializer element is not constan

: środa 16 sie 2017, 18:21
autor: xor
Oczywiście mówiąc "Stala to by bylo" miałem na myśli NONE.
Zrobiłem ad hoc kilka prób, ale wyniki wyszły mi jakieś niejednoznaczne, a na razie nie mam głowy i chęci się wglębiać.
Czasem "int const NONE = -1" było widoczne w .map jako obiekt w sekcji text (wtedy inicjacja buffered_char=NONE wywalała błąd jak w temacie), a czasem nie była widoczna i błędu nie było (czyli tak jakby wyrażenie zostało zoptymalizowane do wartości stałej).