c programmerings fråga, skicka en vektor till en funktion..

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
henkebenke
Inlägg: 515
Blev medlem: 31 maj 2003, 10:42:37
Ort: Helsingborg

Inlägg av henkebenke »

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.
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

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
Användarvisningsbild
Icecap
Inlägg: 26224
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Inlägg av Icecap »

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.
Användarvisningsbild
AndLi
Inlägg: 17362
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Inlägg av AndLi »

Beroende på hur "smart" kompilern är kan man behöva ange antal tecken + 1 till string-termineringen.
Va??
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....
Användarvisningsbild
Icecap
Inlägg: 26224
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Inlägg av Icecap »

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.
Användarvisningsbild
AndLi
Inlägg: 17362
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Inlägg av AndLi »

Aha.. Men gör man så SKA den avslutande nollan försvinna....

Håller nog med om att
const char Test_String[] = "Test";
är ett bättre sätt att göra det på...

Då var det inte så allvarligt som jag fick en känsla av först *puhhh*
Skriv svar