[VisualGDB]initializer element is not constan

W tym miejscu zadajemy pytania na temat języka C, dzielimy się swoją wiedzą, udzielamy wsparcia, rozwiązujemy problemy programistyczne.
Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1168
Rejestracja: czwartek 03 wrz 2015, 22:02

Re: [VisualGDB]initializer element is not constan

Postautor: Antystatyczny » środa 16 sie 2017, 13:14

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;?
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

Awatar użytkownika
xor
User
User
Posty: 169
Rejestracja: poniedziałek 05 wrz 2016, 21:44

Re: [VisualGDB]initializer element is not constan

Postautor: xor » środa 16 sie 2017, 14:00

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;

Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1168
Rejestracja: czwartek 03 wrz 2015, 22:02

Re: [VisualGDB]initializer element is not constan

Postautor: Antystatyczny » środa 16 sie 2017, 16:36

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 :)
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

Awatar użytkownika
xor
User
User
Posty: 169
Rejestracja: poniedziałek 05 wrz 2016, 21:44

Re: [VisualGDB]initializer element is not constan

Postautor: xor » środa 16 sie 2017, 18:21

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).


Wróć do „Pisanie programów w C”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 1 gość