Sida 1 av 2

C-frågor

Postat: 14 oktober 2018, 13:56:45
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 ?

Re: C-frågor

Postat: 14 oktober 2018, 14:18:22
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.

Re: C-frågor

Postat: 14 oktober 2018, 14:22:20
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.

Re: C-frågor

Postat: 14 oktober 2018, 14:23:58
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;

Re: C-frågor

Postat: 14 oktober 2018, 14:32:43
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.

Re: C-frågor

Postat: 14 oktober 2018, 14:54:40
av BJ
Oj...
Det med stjärnan och pekarna hänger jag med på.
Det andra var svårare... :humm:

Re: C-frågor

Postat: 14 oktober 2018, 15:44:21
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.

Re: C-frågor

Postat: 14 oktober 2018, 15:57:53
av BJ
Blir det här också samma sak?:

const char* const Texts[] = {<en massa texter>};
const char const Texts[] = {<en massa texter>};

Re: C-frågor

Postat: 14 oktober 2018, 18:31:37
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>}.

Re: C-frågor

Postat: 15 oktober 2018, 11:14:28
av BJ
Nu vet jag inte vad jag ska skriva... :humm:

Re: C-frågor

Postat: 15 oktober 2018, 11:41:04
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 '&'

Re: C-frågor

Postat: 15 oktober 2018, 12:47:00
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.

Re: C-frågor

Postat: 15 oktober 2018, 12:51:06
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.

Re: C-frågor

Postat: 15 oktober 2018, 13:01:31
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.

Re: C-frågor

Postat: 15 oktober 2018, 13:26:27
av BJ
Okej.