char*

Vse o programiranju na in za PC

Moderatorji: Kroko, tilz0R

char*

OdgovorNapisal/-a Kroko » 22 Sep 2017, 12:07

Kakšna je razlika med:

Koda: Izberi vse
const char* const AAA = "aaa";
static const char* const BBB = "bbb";
static const char* CCC = "ccc";
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4735
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 676 krat
Prejel zahvalo: 1624 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: char*

OdgovorNapisal/-a tilz0R » 22 Sep 2017, 12:23

To je uganka, ali? :)

Koda: Izberi vse
const char* const AAA = "aaa";
AAA = "bbb"; //Error, spremenljivke ni mogoče nastaviti več (drugi const)
*AAA = 'c'; //Error, preko nje nemoremo nastavljati vsebine (prvi const)

Spremenljivka AAA je const (Ob inicializaciji nastaviš kam kaže (pointer), kasneje to ni mogoče spreminjati) in tudi vsebina na katero kaže, je konstanta in je ni možno spreminjati.

Koda: Izberi vse
static const char* const BBB = "bbb";

Isto kot prejšnji primer, le da je spremenljivka vidna samo znotraj modula ali funkcije.

Koda: Izberi vse
static const char* CCC = "ccc";
*CCC = 'a'; //Error, vsebine preko nje ne morem spreminjati
CCC = "ddd"; //OK, lahko spreminjamo, lokacijo na katero kaže

Statična spremenljivka, vidna samo znotraj funkcije ali znotraj modula, kaže na const podatke, vendar lahko spreminjamo kamor kaže, ne moremo pa vsebine, na katero kaže.

Kot je rekel gumby:
'const' ne pomeni konstanta, pač pa 'read only'.


Tako na hitro :)
Knowledge sharing is people' caring., T. MAJERLE
Uporabniški avatar
tilz0R
 
Prispevkov: 1790
Pridružen: 18 Jan 2015, 00:12
Kraj: Črnomelj
Zahvalil se je: 225 krat
Prejel zahvalo: 474 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255

Re: char*

OdgovorNapisal/-a gumby » 22 Sep 2017, 12:31

+1 na zgornje, dodal bi le to, da const ne pomeni "konstanta" ampak "read only".
my brain hurts
Uporabniški avatar
gumby
 
Prispevkov: 2537
Pridružen: 14 Jan 2015, 19:49
Kraj: Lendava
Zahvalil se je: 107 krat
Prejel zahvalo: 593 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 64

Re: char*

OdgovorNapisal/-a Kroko » 22 Sep 2017, 12:52

Ni uganka, nekaj bi si rad razjasnil.
Je v C++ kaj drugače kot v C?

Imam datoteko "consts .h". Vsebina je tole:
Koda: Izberi vse
#ifndef __Consts_H
#define __Consts_H
namespace Consts
{
  static const int MAX = 255;
  const char* const Text1 = "aaa";
  static const char* const Text2 = "bbb";
  static const char* Text3 = "ccc";
}
#endif


Do sedaj sem uporabljal "static const char*". Vendar mislim da je tak primer memorijsko neoptimalen in da bi bilo bolje uporabiti "const char* const" ali celo "static const char* const".
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4735
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 676 krat
Prejel zahvalo: 1624 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: char*

OdgovorNapisal/-a gumby » 22 Sep 2017, 12:57

Boš spreminjal pointer ali vrednost na lokaciji?
Boš spremenjljivko rabil kje "zunaj" ali samo znotraj modula?
my brain hurts
Uporabniški avatar
gumby
 
Prispevkov: 2537
Pridružen: 14 Jan 2015, 19:49
Kraj: Lendava
Zahvalil se je: 107 krat
Prejel zahvalo: 593 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 64

Re: char*

OdgovorNapisal/-a tilz0R » 22 Sep 2017, 13:12

Kroko je napisal/-a:Vendar mislim da je tak primer memorijsko neoptimalen in da bi bilo bolje uporabiti "const char* const" ali celo "static const char* const".


Sklepam, da boš consts.h datoteko uporaljal po celotnem projektu (samo sklepam!). In glede na to, da so to konstante, bi jaz uporabil const char* const abc = "def" koncept. Tako je to zares konstanta za vedno, uporabljena lahko v celotnem projektu.

Še vedno pa lahko uporabiš define :)
Knowledge sharing is people' caring., T. MAJERLE
Uporabniški avatar
tilz0R
 
Prispevkov: 1790
Pridružen: 18 Jan 2015, 00:12
Kraj: Črnomelj
Zahvalil se je: 225 krat
Prejel zahvalo: 474 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255

Re: char*

OdgovorNapisal/-a Kroko » 22 Sep 2017, 13:19

#define bi bilo treba z zakonom prepovedat za take stvari :-)
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4735
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 676 krat
Prejel zahvalo: 1624 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: char*

OdgovorNapisal/-a zanka » 22 Sep 2017, 15:41

Če določiš vsebino dobiš prvi const zastonj. Glede optimizacije je tako. Ta zastonj const da besedilo v .rodata. v bistvu vse string literal gredo v rodata.
Uporabniški avatar
zanka
 
Prispevkov: 2524
Pridružen: 17 Mar 2016, 01:16
Zahvalil se je: 111 krat
Prejel zahvalo: 241 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 48

Re: char*

OdgovorNapisal/-a gumby » 22 Sep 2017, 17:59

Zastonj const?
Koda: Izberi vse
char *foo = "abc";
*foo = 'x';

Tole bi potem moralo javiti napako...
my brain hurts
Uporabniški avatar
gumby
 
Prispevkov: 2537
Pridružen: 14 Jan 2015, 19:49
Kraj: Lendava
Zahvalil se je: 107 krat
Prejel zahvalo: 593 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 64

Re: char*

OdgovorNapisal/-a TilenS » 22 Sep 2017, 18:15

Odvisno kakšno optimizacijo iščemo linker zna dati const v flash ROM in to sigurno ni ravno neka hitrostna optimizacija je pa recimo optimizacija velikosti RAM-a.
TilenS
 
Prispevkov: 355
Pridružen: 05 Feb 2015, 00:40
Zahvalil se je: 0 krat
Prejel zahvalo: 51 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 10

Re: char*

OdgovorNapisal/-a zanka » 22 Sep 2017, 20:07

gumby je napisal/-a:Zastonj const?
Koda: Izberi vse
char *foo = "abc";
*foo = 'x';

Tole bi potem moralo javiti napako...

Prvi const dobiš pred char zastonj.
Uporabniški avatar
zanka
 
Prispevkov: 2524
Pridružen: 17 Mar 2016, 01:16
Zahvalil se je: 111 krat
Prejel zahvalo: 241 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 48

Re: char*

OdgovorNapisal/-a gumby » 22 Sep 2017, 20:25

Tale primer se lahko optimizira kvečjemu v "char * const foo", ne pa v "const char *foo" ali "const char * const foo".
my brain hurts
Uporabniški avatar
gumby
 
Prispevkov: 2537
Pridružen: 14 Jan 2015, 19:49
Kraj: Lendava
Zahvalil se je: 107 krat
Prejel zahvalo: 593 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 64

Re: char*

OdgovorNapisal/-a zanka » 22 Sep 2017, 20:43

A ne gre iz desne v levo? char * const je konstantni kazalec, const char * pa kazalec na konstanten znak?
Uporabniški avatar
zanka
 
Prispevkov: 2524
Pridružen: 17 Mar 2016, 01:16
Zahvalil se je: 111 krat
Prejel zahvalo: 241 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 48

Re: char*

OdgovorNapisal/-a tilz0R » 23 Sep 2017, 10:46

gumby je napisal/-a:Tale primer se lahko optimizira kvečjemu v "char * const foo", ne pa v "const char *foo" ali "const char * const foo".


Glede na to, da bi moral linker poslati vsak string literal v .rodata, bi bilo char * const foo dovolj za optimizacijo. Vsekakor pa const char * const foo ni narobe.
Knowledge sharing is people' caring., T. MAJERLE
Uporabniški avatar
tilz0R
 
Prispevkov: 1790
Pridružen: 18 Jan 2015, 00:12
Kraj: Črnomelj
Zahvalil se je: 225 krat
Prejel zahvalo: 474 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255

Re: char*

OdgovorNapisal/-a zanka » 23 Sep 2017, 14:48

Kroko je napisal/-a:#define bi bilo treba z zakonom prepovedat za take stvari :-)

V slavnih knjigah ravno za (čarobne) konstane priporočajo #define.

Številske vrednosti tedaj podanejo del ukaza in izvrševanje je pomoje veliko hitreje zaradi odsotnosti dodatnega vpogleda v spomin.
Uporabniški avatar
zanka
 
Prispevkov: 2524
Pridružen: 17 Mar 2016, 01:16
Zahvalil se je: 111 krat
Prejel zahvalo: 241 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 48


Vrni se na Programski jeziki

Kdo je na strani

Po forumu brska: 0 registriranih uporabnikov in 1 gost