c programmerings fråga, skicka en vektor till en funktion..
-
- Inlägg: 515
- Blev medlem: 31 maj 2003, 10:42:37
- Ort: Helsingborg
Vad jag menar är att det är enklare att se var minnet tar vägen om man deklarerar konstanter som const-variabler än om man använder defines. Vet iofs inte hur minnes-mappen blir i olika kompilatorer när man använder defines, men den lär bli tydligare med variabler. Dessutom kan man påverka vilket "scope" variabeln har. Och till sist så får konstanten en definierad typ vilket gör att kompilatorn kan kontrollera den.
Pekare = Pekare. Eftersom den är "konstant" så blir givetvis alla referenser en pekare till adressen i kodminnet. Precis som en const. I 99% av alla kompilatorer kommer resultatet bli precis detsamma oavsett metod. Men jag föredrar att använda #define då det är frågan om ASCII-strängar.
Skulle det däremot vara en array av 16- eller 32-bitars variabler, då är det givetvis en const som gäller. Men det var det väl inte tal om här?
Mvh
speakman
Skulle det däremot vara en array av 16- eller 32-bitars variabler, då är det givetvis en const som gäller. Men det var det väl inte tal om här?
Mvh
speakman
Jag kan tänka mig att vissa kompilatorer utan "vett i skallen" kan upprepa samma #define fler gånger om man använder den fler gånger såklart.
Men med en vettig kompilator skulle:
#define TEST_STRING "Detta är en test"
exakt motsvara
const char * TEST_STRING = "Detta är en test";
vad angår minnesbehov, användbarhet osv.
Det kan även deklareras:
const char TEST_STRING[] = "Detta är en test";
eller
const char TEST_STRING[17] = "Detta är en test";
Beroende på hur "smart" kompilern är kan man behöva ange antal tecken + 1 till string-termineringen.
Men med en vettig kompilator skulle:
#define TEST_STRING "Detta är en test"
exakt motsvara
const char * TEST_STRING = "Detta är en test";
vad angår minnesbehov, användbarhet osv.
Det kan även deklareras:
const char TEST_STRING[] = "Detta är en test";
eller
const char TEST_STRING[17] = "Detta är en test";
Beroende på hur "smart" kompilern är kan man behöva ange antal tecken + 1 till string-termineringen.
Va??Beroende på hur "smart" kompilern är kan man behöva ange antal tecken + 1 till string-termineringen.
Du skulle inte kunna utveckla hur du tänker där?
I min värld är alltid en string nullterminerad, annars är den ingen string utan en helt vanlig array av chars.
Och gör man då en
char short_string[6] ="Nisse";
Så kommer det alltid ta 6 bytes för att få plats med nisse som en sträng.
Menar du att nedanstående skulle funka och att kompilatorn skulle ta beslutet att ändra min 5 till en 6a? Sånna kompilatorer hoppas jag aldrig råka ut för.... En varning kan de få ge... eller tom ett error... men inga ändringar av koden..
char short_string[5] ="Nisse";
Hoppas jag missförstått något....
Enkelt:
Vissa kompilatorer kräver att man anger hur stort utrymme som man vill ha.
Om man då deklarerar:
const char Test_String[4] = "Test";
kommer den avslutande '\0' att försvinna.
Såklart ska man, om inte kompilern sparkar bakåt, deklarera det:
const char Test_String[] = "Test";
och kompilern tar hand om storleken, precis som det bör vara.
Den enda kompiler jag har mött med det problem är Keil 8031 C kompiler och det skit har jag kastat sedan länge.
Vissa kompilatorer kräver att man anger hur stort utrymme som man vill ha.
Om man då deklarerar:
const char Test_String[4] = "Test";
kommer den avslutande '\0' att försvinna.
Såklart ska man, om inte kompilern sparkar bakåt, deklarera det:
const char Test_String[] = "Test";
och kompilern tar hand om storleken, precis som det bör vara.
Den enda kompiler jag har mött med det problem är Keil 8031 C kompiler och det skit har jag kastat sedan länge.