/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
Bech_bb 500
kyllekylle 500
jdjespers.. 500
gibson 300
scootergr.. 300
molokyle 287
10  strarup 270
const forvirring
Fra : Kent Friis


Dato : 03-08-06 23:06

Lidt forvirring omkring const - med en char * er der tre steder man
kan skrive const, og gcc ser ud til at acceptere dem alle tre:

const char * s;
char const * s;
char * const s;

Hvilken er
- konstant pointer til variabel char?
- variabel pointer til konstant char?
- og hvad er den sidste så?

Og hvordan med char **, char *** osv?

Mvh
Kent

PS: Og hvad hedder det der program (jeg vist ikke har installeret)
der kan forklare præcist hvad sådan en linie betyder?
--
"So there I was surrounded by all these scary creatures
They were even scarier than what Microsoft call features"
- C64Mafia: Forbidden Forest (Don't Go Walking Slow).

 
 
Kent Friis (03-08-2006)
Kommentar
Fra : Kent Friis


Dato : 03-08-06 23:09

Den 03 Aug 2006 22:05:37 GMT skrev Kent Friis:
> Lidt forvirring omkring const - med en char * er der tre steder man
> kan skrive const, og gcc ser ud til at acceptere dem alle tre:
>
> const char * s;
> char const * s;
> char * const s;

Og når ikke andet er angivet, drejer spørgsmålet sig naturligvis om
det sprog gruppen er opkaldt efter Altså C.

Mvh
Kent
--
"So there I was surrounded by all these scary creatures
They were even scarier than what Microsoft call features"
- C64Mafia: Forbidden Forest (Don't Go Walking Slow).

Arne Vajhøj (04-08-2006)
Kommentar
Fra : Arne Vajhøj


Dato : 04-08-06 00:20

Kent Friis wrote:
> Lidt forvirring omkring const - med en char * er der tre steder man
> kan skrive const, og gcc ser ud til at acceptere dem alle tre:
>
> const char * s;
> char const * s;
> char * const s;
>
> Hvilken er
> - konstant pointer til variabel char?
> - variabel pointer til konstant char?
> - og hvad er den sidste så?

http://c-faq.com/ansi/constptrconst.html

Arne

Igor V. Rafienko (04-08-2006)
Kommentar
Fra : Igor V. Rafienko


Dato : 04-08-06 15:14

[ Kent Friis ]

> PS: Og hvad hedder det der program (jeg vist ikke har installeret)
> der kan forklare præcist hvad sådan en linie betyder?


ITYM cdecl.





ivr
--
"...but it's HDTV -- it's got a better resolution than the real world."
       -- Fry, "When aliens attack"

Kent Friis (04-08-2006)
Kommentar
Fra : Kent Friis


Dato : 04-08-06 16:21

Den 04 Aug 2006 16:13:55 +0200 skrev Igor V. Rafienko:
> [ Kent Friis ]
>
>> PS: Og hvad hedder det der program (jeg vist ikke har installeret)
>> der kan forklare præcist hvad sådan en linie betyder?
>
>
> ITYM cdecl.

Jeps, er installeret og leget lidt med. Og det gjorde tingene meget
tydeligere.

Tak til jer begge.

Mvh
Kent
--
"So there I was surrounded by all these scary creatures
They were even scarier than what Microsoft call features"
- C64Mafia: Forbidden Forest (Don't Go Walking Slow).

Ukendt (04-08-2006)
Kommentar
Fra : Ukendt


Dato : 04-08-06 17:29


Kent Friis skrev:
> Lidt forvirring omkring const - med en char * er der tre steder man
> kan skrive const, og gcc ser ud til at acceptere dem alle tre:
>
> const char * s;
> char const * s;
> char * const s;
>
> Hvilken er
> - konstant pointer til variabel char?
> - variabel pointer til konstant char?
> - og hvad er den sidste så?
>
> Og hvordan med char **, char *** osv?

Den sidste læses bagfra som en konstant (const) pointer (*) til en char.

Jeg var en gang på et C++ seminar hvor jeg lærte et godt trick til
hvordan man placerer pointere (*) og for så vidt også referencer. Og
jeg har brugt det konsekvent lige siden.

Det gælder i al sin enkelthed om at skrive den ønskede type så den kan
læses bagfra som den ønskede type.

En pointer til en char skrives
char * (doh)

En pointer til en pointer til en char:
char **

En konstant pointer til en konstant pointer til en konstant char:
char const * const * const

En pointer til en konstant char:
char const *

En konstant pointer til en char:
char * const

En konstant pointer til en konstant char:
char const * const

En konstant pointer til en konstant reference til en konstant streng:
string const & const * const

Find selv på flere


Claus








Ivan Johansen (04-08-2006)
Kommentar
Fra : Ivan Johansen


Dato : 04-08-06 22:16

Claus Jensen wrote:
> En konstant pointer til en konstant reference til en konstant streng:
> string const & const * const

Bemærk at en reference ikke kan være konstant og du kan ikke lave en
pointer til en reference.

Ivan Johansen


Kent Friis (04-08-2006)
Kommentar
Fra : Kent Friis


Dato : 04-08-06 22:33

Den Fri, 04 Aug 2006 23:15:45 +0200 skrev Ivan Johansen:
> Claus Jensen wrote:
>> En konstant pointer til en konstant reference til en konstant streng:
>> string const & const * const
>
> Bemærk at en reference ikke kan være konstant og du kan ikke lave en
> pointer til en reference.

Var det ikke nemmere at sige: "bemærk at man ikke kan lave en
reference"?

(Skal vi ikke snart have en separat C++-gruppe, så vi undgår al den
forvirring når folk poster C++-svar på C-spørgsmål?)

Mvh
Kent
--
"So there I was surrounded by all these scary creatures
They were even scarier than what Microsoft call features"
- C64Mafia: Forbidden Forest (Don't Go Walking Slow).

Bertel Lund Hansen (05-08-2006)
Kommentar
Fra : Bertel Lund Hansen


Dato : 05-08-06 00:51

Kent Friis skrev:

> (Skal vi ikke snart have en separat C++-gruppe, så vi undgår al den
> forvirring når folk poster C++-svar på C-spørgsmål?)

Jeg er sådan set enig. Spørgsmålet er bare om vi i praksis kan
skille de to slags trafik? M.a.o. kan vi stole på at spørgerne
skelner når de vil starte en tråd?

Vi kunne gå over til at 'forlange' at overskriften skal indledes
med én af de tre følgende:
[C]
[C++]
[C/C++]
og så i første omgang bare begynde at gøre det selv.

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Arne Vajhøj (05-08-2006)
Kommentar
Fra : Arne Vajhøj


Dato : 05-08-06 01:03

Bertel Lund Hansen wrote:
> Kent Friis skrev:
>> (Skal vi ikke snart have en separat C++-gruppe, så vi undgår al den
>> forvirring når folk poster C++-svar på C-spørgsmål?)
>
> Jeg er sådan set enig. Spørgsmålet er bare om vi i praksis kan
> skille de to slags trafik? M.a.o. kan vi stole på at spørgerne
> skelner når de vil starte en tråd?
>
> Vi kunne gå over til at 'forlange' at overskriften skal indledes
> med én af de tre følgende:
> [C]
> [C++]
> [C/C++]

Jeg er glad for den tredie kategori, fordi nogen
gange er det lidt af hvert.

Eksempel: kald af MySQL C API fra C++ program.

Arne

Michael Rasmussen (05-08-2006)
Kommentar
Fra : Michael Rasmussen


Dato : 05-08-06 01:16

On Fri, 04 Aug 2006 20:02:39 -0400, Arne Vajhøj wrote:

>
> Jeg er glad for den tredie kategori, fordi nogen gange er det lidt af
> hvert.
Ethvert kald til kernens API, vil være lidt af hvert. Det være sig
Windows, Mac eller Linux.

Hvad angår opdeling generelt, bør disse faktorer vejes op mod hinanden:
1) Er det sprogenes syntaks og semantik vi diskuterer?
2) Er det praktisk anvendelse af sprogene på konkrete problemstillinger?
3) Er listen "åben" for alle, eller skal vi dyrke sproglig eksegese?

Jeg heller mest til 2, hvorfor jeg ikke er tilhænger af en opsplitning.
Folk der ønsker diskussioner af syntaks og semantik, kan finde det i
comp.lang.c[++].

--
Hilsen/Regards
Michael Rasmussen
http://keyserver.veridis.com:11371/pks/lookup?op=get&search=0xE3E80917


Bertel Brander (05-08-2006)
Kommentar
Fra : Bertel Brander


Dato : 05-08-06 01:26

Bertel Lund Hansen wrote:
> Kent Friis skrev:
>
>> (Skal vi ikke snart have en separat C++-gruppe, så vi undgår al den
>> forvirring når folk poster C++-svar på C-spørgsmål?)
>
> Jeg er sådan set enig. Spørgsmålet er bare om vi i praksis kan
> skille de to slags trafik? M.a.o. kan vi stole på at spørgerne
> skelner når de vil starte en tråd?
>
> Vi kunne gå over til at 'forlange' at overskriften skal indledes
> med én af de tre følgende:
> [C]
> [C++]
> [C/C++]
> og så i første omgang bare begynde at gøre det selv.

Jeg tror ikke at der er trafik nok til to grupper og de
fleste spørgsmål falder alligevel i gruppe [C/C++].

Men det ville være rart om de der spørger og de der
svarer gjorde opmærksom på hvilket sprog de snakker
om, hvis det gør en forskel.

(I øvrigt er det sjovere at snakke const i C++, for
der gør den en forskel.)

--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel

Kent Friis (05-08-2006)
Kommentar
Fra : Kent Friis


Dato : 05-08-06 10:06

Den Sat, 05 Aug 2006 02:26:19 +0200 skrev Bertel Brander:
> Bertel Lund Hansen wrote:
>> Kent Friis skrev:
>>
>>> (Skal vi ikke snart have en separat C++-gruppe, så vi undgår al den
>>> forvirring når folk poster C++-svar på C-spørgsmål?)
>>
>> Jeg er sådan set enig. Spørgsmålet er bare om vi i praksis kan
>> skille de to slags trafik? M.a.o. kan vi stole på at spørgerne
>> skelner når de vil starte en tråd?
>>
>> Vi kunne gå over til at 'forlange' at overskriften skal indledes
>> med én af de tre følgende:
>> [C]
>> [C++]
>> [C/C++]
>> og så i første omgang bare begynde at gøre det selv.
>
> Jeg tror ikke at der er trafik nok til to grupper og de
> fleste spørgsmål falder alligevel i gruppe [C/C++].
>
> Men det ville være rart om de der spørger og de der
> svarer gjorde opmærksom på hvilket sprog de snakker
> om, hvis det gør en forskel.

Jeg gjorde faktisk opmærksom på at det var C jeg spurgte om, selvom
det først var i nummer to indlæg, sendt to minutter efter det første.

Alligevel kom der C++-svar.

> (I øvrigt er det sjovere at snakke const i C++, for
> der gør den en forskel.)

Jeg startede faktisk (i C) med at prøve mig frem med hvor const
skulle stå for at jeg fik den ønskede effekt. Det må da betyde at
det gør en forskel. Selvom compileren måske af tradition er lidt
mere lempelig med hvad den accepterer ved fx funktionskald.

Mvh
Kent
--
"So there I was surrounded by all these scary creatures
They were even scarier than what Microsoft call features"
- C64Mafia: Forbidden Forest (Don't Go Walking Slow).

Bertel Brander (05-08-2006)
Kommentar
Fra : Bertel Brander


Dato : 05-08-06 16:09

Kent Friis wrote:
> Jeg startede faktisk (i C) med at prøve mig frem med hvor const
> skulle stå for at jeg fik den ønskede effekt. Det må da betyde at
> det gør en forskel. Selvom compileren måske af tradition er lidt
> mere lempelig med hvad den accepterer ved fx funktionskald.

I C giver det højest (pr. ANSI standard) en warning hvis man
ikke har sine const på plads, i C++ vil det ikke oversætte.

(For at være mere præcis, der står at compileren skal komme
med en "diagnostic", som compileren giver som en Warning.)

--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel

Kent Friis (05-08-2006)
Kommentar
Fra : Kent Friis


Dato : 05-08-06 16:49

Den Sat, 05 Aug 2006 17:08:34 +0200 skrev Bertel Brander:
> Kent Friis wrote:
>> Jeg startede faktisk (i C) med at prøve mig frem med hvor const
>> skulle stå for at jeg fik den ønskede effekt. Det må da betyde at
>> det gør en forskel. Selvom compileren måske af tradition er lidt
>> mere lempelig med hvad den accepterer ved fx funktionskald.
>
> I C giver det højest (pr. ANSI standard) en warning hvis man
> ikke har sine const på plads, i C++ vil det ikke oversætte.

Dvs med -Werror er der ingen forskel?

Mvh
Kent
--
"So there I was surrounded by all these scary creatures
They were even scarier than what Microsoft call features"
- C64Mafia: Forbidden Forest (Don't Go Walking Slow).

Bertel Brander (05-08-2006)
Kommentar
Fra : Bertel Brander


Dato : 05-08-06 19:14

Kent Friis wrote:
> Dvs med -Werror er der ingen forskel?

At én compiler har en option der gør at "diagnostic's"
bliver betragtet som fejl, gør det ikke til standard

Ifølge C standarden er det _ikke_ en fejl at tilskrive
en værdi til en const pointer (resultatet _kan_ være
"udefineret", men det er der så meget der er).

--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel

Kent Friis (05-08-2006)
Kommentar
Fra : Kent Friis


Dato : 05-08-06 19:22

Den Sat, 05 Aug 2006 20:13:34 +0200 skrev Bertel Brander:
> Kent Friis wrote:
>> Dvs med -Werror er der ingen forskel?
>
> At én compiler har en option der gør at "diagnostic's"
> bliver betragtet som fejl, gør det ikke til standard

Nej, men det er en ret effektiv måde at opdage / undgå utilsigtet
opførsel, aka. bugs.

> Ifølge C standarden er det _ikke_ en fejl at tilskrive
> en værdi til en const pointer (resultatet _kan_ være
> "udefineret", men det er der så meget der er).

Men programmet bliver ikke forkert af at få rettet de utilsigtede
skrivninger, selvom de ikke er en fejl iflg. standarden. Og når de
er rettet, kan programmet stadig compiles af andre compiler der
ikke betragter det som en fejl.

Mvh
Kent
--
"So there I was surrounded by all these scary creatures
They were even scarier than what Microsoft call features"
- C64Mafia: Forbidden Forest (Don't Go Walking Slow).

Bertel Brander (05-08-2006)
Kommentar
Fra : Bertel Brander


Dato : 05-08-06 19:36

Kent Friis wrote:
> Den Sat, 05 Aug 2006 20:13:34 +0200 skrev Bertel Brander:
>> Kent Friis wrote:
>>> Dvs med -Werror er der ingen forskel?
>> At én compiler har en option der gør at "diagnostic's"
>> bliver betragtet som fejl, gør det ikke til standard
>
> Nej, men det er en ret effektiv måde at opdage / undgå utilsigtet
> opførsel, aka. bugs.
>
>> Ifølge C standarden er det _ikke_ en fejl at tilskrive
>> en værdi til en const pointer (resultatet _kan_ være
>> "udefineret", men det er der så meget der er).
>
> Men programmet bliver ikke forkert af at få rettet de utilsigtede
> skrivninger, selvom de ikke er en fejl iflg. standarden. Og når de
> er rettet, kan programmet stadig compiles af andre compiler der
> ikke betragter det som en fejl.

Lige gyldig hvad man gør, opnår man aldrig en elegant
"const correctness" i C.
Alene det at en "string literal" ikke er const.

Og jeg går heller ikke ud fra at din compiler
vil brokke sig over:

const char* p = "ole";
strchr(p, 'o')[0] = 'O';

--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel

Kent Friis (05-08-2006)
Kommentar
Fra : Kent Friis


Dato : 05-08-06 20:08

Den Sat, 05 Aug 2006 20:35:30 +0200 skrev Bertel Brander:
> Kent Friis wrote:
>> Den Sat, 05 Aug 2006 20:13:34 +0200 skrev Bertel Brander:
>>> Kent Friis wrote:
>>>> Dvs med -Werror er der ingen forskel?
>>> At én compiler har en option der gør at "diagnostic's"
>>> bliver betragtet som fejl, gør det ikke til standard
>>
>> Nej, men det er en ret effektiv måde at opdage / undgå utilsigtet
>> opførsel, aka. bugs.
>>
>>> Ifølge C standarden er det _ikke_ en fejl at tilskrive
>>> en værdi til en const pointer (resultatet _kan_ være
>>> "udefineret", men det er der så meget der er).
>>
>> Men programmet bliver ikke forkert af at få rettet de utilsigtede
>> skrivninger, selvom de ikke er en fejl iflg. standarden. Og når de
>> er rettet, kan programmet stadig compiles af andre compiler der
>> ikke betragter det som en fejl.
>
> Lige gyldig hvad man gør, opnår man aldrig en elegant
> "const correctness" i C.
> Alene det at en "string literal" ikke er const.
>
> Og jeg går heller ikke ud fra at din compiler
> vil brokke sig over:
>
> const char* p = "ole";
> strchr(p, 'o')[0] = 'O';

Hverken C eller C++ compileren brokker sig. Og uanset om jeg compiler
det som C eller C++ får jeg segfault på runtime-tidspunktet når den
forsøger at skrive til en konstant.

Hvor var det du sagde forskellen var?

Mvh
Kent
--
"So there I was surrounded by all these scary creatures
They were even scarier than what Microsoft call features"
- C64Mafia: Forbidden Forest (Don't Go Walking Slow).

Bertel Brander (05-08-2006)
Kommentar
Fra : Bertel Brander


Dato : 05-08-06 22:09

Kent Friis wrote:
> Hvor var det du sagde forskellen var?

I C++ har du muligheden for at lave det ordentligt.

--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel

Kent Friis (05-08-2006)
Kommentar
Fra : Kent Friis


Dato : 05-08-06 22:15

Den Sat, 05 Aug 2006 23:09:14 +0200 skrev Bertel Brander:
> Kent Friis wrote:
>> Hvor var det du sagde forskellen var?
>
> I C++ har du muligheden for at lave det ordentligt.

Ud fra din definition af "ordentligt", åbenbart.

Mvh
Kent
--
"So there I was surrounded by all these scary creatures
They were even scarier than what Microsoft call features"
- C64Mafia: Forbidden Forest (Don't Go Walking Slow).

Kim Christiansen (05-08-2006)
Kommentar
Fra : Kim Christiansen


Dato : 05-08-06 16:27

"Bertel Lund Hansen" <nospamfilius@lundhansen.dk> wrote in message
news:44d3dd27$0$3479$ba624c82@nntp02.dk.telia.net...
> Kent Friis skrev:
>
>> (Skal vi ikke snart have en separat C++-gruppe, så vi undgår al den
>> forvirring når folk poster C++-svar på C-spørgsmål?)
>
> Jeg er sådan set enig. Spørgsmålet er bare om vi i praksis kan
> skille de to slags trafik? M.a.o. kan vi stole på at spørgerne
> skelner når de vil starte en tråd?

Er der overhovedet nok traffik til det? dk.programmering.c er i forvejen
ikke vildt belastet, sådan som jeg ser det.



Kent Friis (05-08-2006)
Kommentar
Fra : Kent Friis


Dato : 05-08-06 16:52

Den Sat, 5 Aug 2006 17:27:20 +0200 skrev Kim Christiansen:
> "Bertel Lund Hansen" <nospamfilius@lundhansen.dk> wrote in message
> news:44d3dd27$0$3479$ba624c82@nntp02.dk.telia.net...
>> Kent Friis skrev:
>>
>>> (Skal vi ikke snart have en separat C++-gruppe, så vi undgår al den
>>> forvirring når folk poster C++-svar på C-spørgsmål?)
>>
>> Jeg er sådan set enig. Spørgsmålet er bare om vi i praksis kan
>> skille de to slags trafik? M.a.o. kan vi stole på at spørgerne
>> skelner når de vil starte en tråd?
>
> Er der overhovedet nok traffik til det? dk.programmering.c er i forvejen
> ikke vildt belastet, sådan som jeg ser det.

Hvis det er trafik der er argumentet, ville jeg da hellere blande
C med VB, og C++ med Prolog (fx) - det må give meget mindre forvirring,
da man så ikke vil være i tvivl om folk snakker om det ene eller det
andet sprog.

Mvh
Kent
--
"So there I was surrounded by all these scary creatures
They were even scarier than what Microsoft call features"
- C64Mafia: Forbidden Forest (Don't Go Walking Slow).

Arne Vajhøj (05-08-2006)
Kommentar
Fra : Arne Vajhøj


Dato : 05-08-06 18:05

Kent Friis wrote:
> Hvis det er trafik der er argumentet, ville jeg da hellere blande
> C med VB, og C++ med Prolog (fx) - det må give meget mindre forvirring,
> da man så ikke vil være i tvivl om folk snakker om det ene eller det
> andet sprog.

Jeg tror at den blanding ville give lidt forvrring med
hensyn til subscription ...

ARne

Kent Friis (05-08-2006)
Kommentar
Fra : Kent Friis


Dato : 05-08-06 18:53

Den Sat, 05 Aug 2006 13:04:50 -0400 skrev Arne Vajhøj:
> Kent Friis wrote:
>> Hvis det er trafik der er argumentet, ville jeg da hellere blande
>> C med VB, og C++ med Prolog (fx) - det må give meget mindre forvirring,
>> da man så ikke vil være i tvivl om folk snakker om det ene eller det
>> andet sprog.
>
> Jeg tror at den blanding ville give lidt forvrring med
> hensyn til subscription ...

Vel ikke større forvirring end nu? Grupperne bør naturligvis have
begge sprog i navnet, og ikke som nu, hvor kun det ene sprog er
nævnt.

Mvh
Kent
--
"So there I was surrounded by all these scary creatures
They were even scarier than what Microsoft call features"
- C64Mafia: Forbidden Forest (Don't Go Walking Slow).

Ukendt (05-08-2006)
Kommentar
Fra : Ukendt


Dato : 05-08-06 11:11


Ivan Johansen skrev:
> Claus Jensen wrote:
>> En konstant pointer til en konstant reference til en konstant streng:
>> string const & const * const
>
> Bemærk at en reference ikke kan være konstant og du kan ikke lave en
> pointer til en reference.
>
> Ivan Johansen
>

jeps, du har ret.
Eksemplet burde nok have vist det omvendte, á la en reference til en
konstant pointer...

Claus

Søg
Reklame
Statistik
Spørgsmål : 177428
Tips : 31962
Nyheder : 719565
Indlæg : 6407944
Brugere : 218877

Månedens bedste
Årets bedste
Sidste års bedste