C-frågor

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
BJ
Inlägg: 8185
Blev medlem: 11 april 2007, 08:14:53
Ort: En_stad

C-frågor

Inlägg av BJ »

Ibland när jag tittar på andras program
så ser jag saker som jag inte förstår.
På sidan
http://www.piclist.com/techref/microchi ... /index.htm
i arkivet hitachilcd-ak.zip
och filen lcd.c, finns

const byte const LCD_ROW_ADDRESS[] =...

Vad gör en sådan deklaration?
Vad är vitsen med att använda ordet const
två gånger i den?

Blir det samma sak om man skriver
char* message
som när man skriver
char *message ?
Senast redigerad av BJ 14 oktober 2018, 14:19:02, redigerad totalt 1 gång.
Zkronk
Inlägg: 1423
Blev medlem: 23 augusti 2005, 16:44:36
Ort: Uppsala

Re: C-frågor

Inlägg av Zkronk »

Om jag har förstått det hela rätt så betyder det att både pekaren och det som pekaren pekar på (arrayen) bli oföränderliga.
I och med att en variabel i C när det gäller arrayer automatiskt blir en pekarvariabel som pekar på minnesadressen där arrayen börjar.
Användarvisningsbild
Icecap
Inlägg: 26105
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: C-frågor

Inlägg av Icecap »

Det är en const pekare som pekar på const char.

Jag hade problem med detta i sin tid, jag deklarerade:
const char* Texts[] = {<en massa texter>};

Då jag lade till några fler texter i egna deklarationer tog minnet slut - men det var RAM-minnet!
Det visade sig att det blev tolkat av kompilern som att det var ett array av konstanta pekare som pekade på data i RAM.

Efter att ha ändrat till const char* const Texts[] = {<en massa texter>}; blev alla pekare SAMT de data de pekade på lagt i ROM där det var oceaner av plats för sånt.
Användarvisningsbild
arvidb
Inlägg: 4537
Blev medlem: 8 maj 2004, 12:56:24
Ort: Stockholm

Re: C-frågor

Inlägg av arvidb »

BJ skrev:Blir det samma sak om man skriver
char* message
som när man skriver
char *message ?
Ja.

Tyvärr har C väldigt otydlig syntax ibland. Man kan tycka att det "rätta" sättet att deklarera två char-pointer-variabler borde vara:
char* pointer1, pointer2;

Men den deklarationen ger en char-pekare och en char ("pointer2" är en char).

Rätta sättet är:
char *pointer1, *pointer2;
Användarvisningsbild
arvidb
Inlägg: 4537
Blev medlem: 8 maj 2004, 12:56:24
Ort: Stockholm

Re: C-frågor

Inlägg av arvidb »

Icecap skrev:Efter att ha ändrat till const char* const Texts[] = {<en massa texter>}; blev alla pekare SAMT de data de pekade på lagt i ROM där det var oceaner av plats för sånt.
Det skumma är att const är left-associative i C, om det inte står först på en rad. Så
int const * x;
ger en icke-constant pekare till ett "const int"-värde, och
int * const x;
ger en konstant pekare till en icke-const int. Mycket skumt.

Icecaps deklaration ovan ger en icke-const-pekare ("Texts") till en array av const-pekare till data av typen const char, om jag tolkar den rätt.
BJ
Inlägg: 8185
Blev medlem: 11 april 2007, 08:14:53
Ort: En_stad

Re: C-frågor

Inlägg av BJ »

Oj...
Det med stjärnan och pekarna hänger jag med på.
Det andra var svårare... :humm:
BJ
Inlägg: 8185
Blev medlem: 11 april 2007, 08:14:53
Ort: En_stad

Re: C-frågor

Inlägg av BJ »

Icecap skrev:Det är en const pekare som pekar på const char.
Zkronk skrev:Om jag har förstått det hela rätt så betyder det
att både pekaren och det som pekaren pekar på (arrayen) bli oföränderliga.
I och med att en variabel i C när det gäller arrayer automatiskt blir en
pekarvariabel som pekar på minnesadressen där arrayen börjar.
Okej. Så långt hänger jag med.
Det andra får jag nog se som överkurs, tror jag.
BJ
Inlägg: 8185
Blev medlem: 11 april 2007, 08:14:53
Ort: En_stad

Re: C-frågor

Inlägg av BJ »

Blir det här också samma sak?:

const char* const Texts[] = {<en massa texter>};
const char const Texts[] = {<en massa texter>};
Användarvisningsbild
arvidb
Inlägg: 4537
Blev medlem: 8 maj 2004, 12:56:24
Ort: Stockholm

Re: C-frågor

Inlägg av arvidb »

Nä.

Läs från höger:
const char* const Texts[] = {<en massa texter>};
"Arrayen Texts innehåller const * till const char"

const char const Texts[] = {<en massa texter>};
"Arrayen Texts innehåller const char - och sen const igen?" Detta bör ge kompileringsfel av två anledningar: dels är syntaxen synnerligen tveksam - vad betyder det egentligen? - och dels matchar inte datatypen {<en massa texter>}.
BJ
Inlägg: 8185
Blev medlem: 11 april 2007, 08:14:53
Ort: En_stad

Re: C-frågor

Inlägg av BJ »

Nu vet jag inte vad jag ska skriva... :humm:
Användarvisningsbild
Icecap
Inlägg: 26105
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: C-frågor

Inlägg av Icecap »

Tänk såhär:
De enskilde texterna blir ju några bytes i minnet. Vid att deklarera dom som 'const' bör de per automatik bli lagt i ROM.
Detta blir då:
const char Text01[] = "Någon text här\r\n";
const char Text02[] = "Någon annan text här";
osv.

För att komma åt dessa texter behövs egentligen bara startadressen i minnet för var och en av dom. Det kan man klara vid att deklarera:
const char *Text01P = &Text01;
const char *Text02P = &Text02;
osv.

Dessa pekare kan man sedan istället peta in i en tabell:
const char *Texts[] = {&Text01, &Text02};

De tomma [] betyder för kompilern "det finns ett antal element och du ska reservera plats åt dom alla själv". I grunden är det fel att skriva tomma [] men alla moderna kompilers klarar jobbet själv numera.

I fallet med texterna är elementen som ingår varje bokstav inkl. den avslutande noll (0x00), i fallet med pekarlistan är det minnesadresser som är elementen.

EDIT: Hoppla, hade glömt en '&'
Senast redigerad av Icecap 15 oktober 2018, 12:48:13, redigerad totalt 1 gång.
BJ
Inlägg: 8185
Blev medlem: 11 april 2007, 08:14:53
Ort: En_stad

Re: C-frågor

Inlägg av BJ »

Okej, det hänger jag med på,
om man lägger tll ett &-tecken
före Text02 också.

Jag har för mig att någon har sagt att
t = text[] är samma som att skriva t = &text.
Men det kan ju vara fel.
Användarvisningsbild
Icecap
Inlägg: 26105
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: C-frågor

Inlägg av Icecap »

Har justerat mitt förra inlägg, jag hade helt rätt glömt en &.

Om text är en array (text[]) (vilket det ju brukar vara) är båda sätt identiska.
Begär man "generell" tillgång till en array får man startadressen, begär man tillgång till adressen av arrayen får man det samma.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43147
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: C-frågor

Inlägg av sodjan »

Jäkla tur att C enbart är avsett för lågnivå/maskinnära programmering.
Och att det finns bättre/säkrare alternativ för applikationsprogrammering.
BJ
Inlägg: 8185
Blev medlem: 11 april 2007, 08:14:53
Ort: En_stad

Re: C-frågor

Inlägg av BJ »

Okej.
Skriv svar