[C/C++] #define czy globalna zmienna typu const ???

Odpowiedz Nowy wątek
2003-02-06 14:14

Rejestracja: 17 lat temu

Ostatnio: 13 lat temu

0

Załużmy że mamy w programie jakąś wartość . Dla przykładu niech to będzie jakaś stała , np PI ( 3.1415926535897932384626 ) , oczywiście nie taka długa ( nie mamy tej wartość zdefiniowanej w żadnej bibliotece matematycznej ! ) . Tą wartość potrzebujemy w całym programie . Nie chce nam sie wszędzie wpisywać tej długiej wartości , tam gdzie jest potrzebna , tylko chcemy zmienić ją w jednym miejscu i zostanie to uwzględnione wszędzie indziej ( np jest gra , mamy kolor planszy , jest on wykorzystywany 100 razy w kodzie , a my chcemy go zmienić w jednym miejscu i nie latać po tych 100 innych ) .
Pozostają nam wyjścia :
#define kolor_planszy 15
lub
const int kolor_planszy=15; // jako zmienna globalna
Teraz w tych 100 miejscach wpisujemy tylko kolor_planszy i jak chcemy go zmienic , to zmieniamy jego wart tylko na poczatku kodu , w jednym miejscu . Tylko , że niezbyt milewidziane są te 2 sposoby .
Jakby co to który byście wybrali i dlaczego ??
Może znacie inne lepsze rozwiązanie ( żadne składowe klas !! ) ??


Pozostało 580 znaków

2003-02-06 14:27

Rejestracja: 18 lat temu

Ostatnio: 2 lata temu

0

const


Life is just a dream, you know...
[Cowboy Bebop]

Pozostało 580 znaków

2003-02-06 16:46

Rejestracja: 17 lat temu

Ostatnio: 2 dni temu

0

const

to bedzie ja mogl wtedy zmienic?

dopisane:
no, a ja rozumiem ze Autor chce miec mozliwosc edycji jej wartosci podczas dzialania programu.

znowu dopisane:
aha, to w takim wypadku const :).

Pozostało 580 znaków

2003-02-06 16:54

Rejestracja: 18 lat temu

Ostatnio: 2 lata temu

0

to bedzie ja mogl wtedy zmienic?

Nie.


Life is just a dream, you know...
[Cowboy Bebop]

Pozostało 580 znaków

2003-02-06 19:08

Rejestracja: 17 lat temu

Ostatnio: 13 lat temu

0

ta wartosc ma byc stala w programie , tylko po zmienieniu w jednym miejscu w kodzie ma sie zmienic wszedzie indziej


Pozostało 580 znaków

2003-02-07 18:48

Rejestracja: 17 lat temu

Ostatnio: 9 lat temu

0

oczywiscie ze wartosc const mozna zmieniac ale tylko z poziomu edycji kodu i o to wydaje mi sie tobie chodzi, jesli chodzi o moj punkt widzenia to ja zawsze przy jakimkolwiek projekcie robie sobie plik : def.h w ktorym to mam wszystkie zmienne globalne tudziez uwagi do ustawien,to czy uzyc const int / a int to zalezy od programisty bo po co definiowac kolor czegos tam jako const? przeciez mozna go np zmienic w trakcie dzialania programu ... taka moja sugestia


jakby co:GG4627724

Pozostało 580 znaków

2003-02-07 20:43

Rejestracja: 17 lat temu

Ostatnio: 11 lat temu

0

Algor TrOuBLE chyba chobziło o to, że niechce zmieniać wartości podczas działania programu tylko przed kompilacją, on chciał się dowiedzieć co jest lepiej stosować (naszym zdaniem) #define czy np: const int zmienna=1; .
Jeżeli masz mało tych stałych wartości to można #define, tak byłem uczony, choć niewidze żadnej (potencjalnej) różnicy jeżeli napiszemy 100 razy #define zamiast twożyć zmienne globalne z modyfikatorem const (choć oczywiście moge się mylić). Osobiście nie nadużywał bym #define ponieważ ma większe możliwości niż zmienne globalne (np: pisanie makr). Ale wybór należy do ciebie.

Pozostało 580 znaków

2003-02-07 21:45

Rejestracja: 17 lat temu

Ostatnio: 9 lat temu

0

masz racje szwagier i tylko potwierdzasz moje zdanie (moim zdaniem hehe), natomiast z tym def.h chodzilo mi o dobry nawyk,poniewaz wnioskuje ze w/w problem dotyczy w miare zlozonych projektow bo jesli mowimy o 30 linijkach kodu to ja prawie nie widze roznicy jak sie to zadeklaruje i gdzie,to tyle

natomiast wg mnie (a moge sie mylic) podstawowa roznica midzy
#define a const costam polega na tym ze w zaleznosci od kompilatora mozemy ciutke zaoszczedzic miejsca np w bc31 (o ile mi wiadomo)
#define kolor 15 - kopmilator zapisuje to w 2bajtach czyli int
a mozna w zaleznosci od zastosowan const char kolor = 15;
i w wiekszosci wypadkow bedzie ok, a zaoszcedzimy az 1 bajt(slownie:
jeden bajt hehe)
taka to subtelna roznica

ale nie mam zadnej knigi pod reka teraz wiec powtarzam moge sie mylic


jakby co:GG4627724

Pozostało 580 znaków

2003-02-07 22:32

Rejestracja: 17 lat temu

Ostatnio: 13 lat temu

0

jak zdefiniujemy coś dyrektywą preprocesora ( czy coś w tym stylu ;) ) #define , to to nic w pamieci nie zajmie . jak sie napisze np #define n 20 , to kompilator wszedzie tam gdzie w kodzie jest 'n' wpisze liczbe 20 ...


Pozostało 580 znaków

Anonim
2003-02-07 22:46
Anonim
0

jak zdefiniujemy coś dyrektywą preprocesora ( czy coś w tym stylu ;) ) #define , to to nic w pamieci nie zajmie . jak sie napisze np #define n 20 , to kompilator wszedzie tam gdzie w kodzie jest 'n' wpisze liczbe 20 ...

tak masz racje teraz sobie przypomnialem (ale plama) sorka

Pozostało 580 znaków

2003-02-07 23:08

Rejestracja: 17 lat temu

Ostatnio: 9 lat temu

0

heh to bylem ja Algor ^ tylko z innego kompa i sie nie zalogowalem
(adminy nie wsciekajcie sie bo nie mam mozliwosci edycji mojego posta bo jest anonim)

tak przy okazji to natknelem sie na jednej z moich ulubionych stron na cos takiego :

Osoby mające doświadczenie w kodowaniu w C często piszą

#define COUNT 50

albo
#define MAX(a,b) (a > b ? a : b)

Zapisy tego typu sprawiają jednak problemy - najpoważniejszym są problemy z kompilacją, które sprawiamy użytkownikom naszego kodu. Wyobraźmy sobie, że ktoś po dołączeniu naszego nagłówka będzie chciał zdefiniować własną stałą, funkcję czy metodę o nazwie MAX lub COUNT. W przypadku makr z parametrami zdarzają się też subtelniejsze problemy, wyobraźmy sobie, że ktoś napisał

MAX(++a, ++b);

Nie ma też żadnej kontroli typów.
Pisząc w C++, w większości przypadków możemy zastąpić makra równie wydajnymi ale bezpiecznymi instrukcjami tego języka. Dla przykładu

const int COUNT = 50;

oraz
template
inline MAX(const ParamType& left, const ParamType& right)
{
return left > right ? left : right;
}

Funkcje inline mają tą miłą cechę, że o ile w kodzie produkcyjnym (release) są rozwijane w miejscu wywołania tak samo jak makra (a więc równie wydajne), o tyle w wersjach debug mogą zostać zachowane jako niezależne wywołania (co pozwala np. umieścić w nich breakpoint).

mysle , ze to wyczerpuje ten temat


jakby co:GG4627724

Pozostało 580 znaków

Odpowiedz

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