/ 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
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Enum i C++
Fra : Bertel Brander


Dato : 20-05-04 22:40

Hej,

Hvorfor er følgende ikke et gyldigt C++ program, når
det er et gyldigt C program?

enum WeekDay
{
Monday, Tuesday, Wednesday, Thursday,
Friday, Saturday, Sunday, Numdays
};

int main()
{
enum WeekDay Day;
for(Day = Monday; Day < Numdays; Day++)
;
return 0;
}

Der er Days++ den ikke vil oversætte.

Jeg ved godt at der er andre måder at lave det på,
men jeg synes ikke der er noget galt med ovenstående
metode.

/b

 
 
Bertel Lund Hansen (21-05-2004)
Kommentar
Fra : Bertel Lund Hansen


Dato : 21-05-04 00:22

Bertel Brander skrev:

>Hvorfor er følgende ikke et gyldigt C++ program, når
>det er et gyldigt C program?

Borlands C++ 5.5 oversætter det fint både som c- og cpp-fil.

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

Bertel Brander (21-05-2004)
Kommentar
Fra : Bertel Brander


Dato : 21-05-04 01:00

Bertel Lund Hansen wrote:
> Bertel Brander skrev:
>
>
>>Hvorfor er følgende ikke et gyldigt C++ program, når
>>det er et gyldigt C program?
>
>
> Borlands C++ 5.5 oversætter det fint både som c- og cpp-fil.
>

Det gør den ikke hvis man beder den om at overholde Ansi C++
standarden, hvilket man gør ved at angive -A på kommandolinien.

/b

Mogens Hansen (21-05-2004)
Kommentar
Fra : Mogens Hansen


Dato : 21-05-04 10:15


"Bertel Brander" <bertel@post4.tele.dk> wrote in message
news:40ad24fb$0$535$edfadb0f@dread14.news.tele.dk...
> Hej,
>
> Hvorfor er følgende ikke et gyldigt C++ program, når
> det er et gyldigt C program?
>
> enum WeekDay
> {
> Monday, Tuesday, Wednesday, Thursday,
> Friday, Saturday, Sunday, Numdays
> };
>
> int main()
> {
> enum WeekDay Day;
> for(Day = Monday; Day < Numdays; Day++)
> ;
> return 0;
> }
>
> Der er Days++ den ikke vil oversætte.

Det er fordi i C (C89 - jeg kan ikke hurtigt se at det er ændret i C99) er
det tilladt at tildele en enum en heltalsværdi
Days = 12;
hvilket ikke er tilladt i C++.

Det er beskrevet i
The C++ Programming Language, Third Edition
Bjarne Stroustrup
ISBN 0-201-88954-4
side 817

Venlig hilsen

Mogens Hansen



Bertel Brander (21-05-2004)
Kommentar
Fra : Bertel Brander


Dato : 21-05-04 19:01

Mogens Hansen wrote:
>
> Det er fordi i C (C89 - jeg kan ikke hurtigt se at det er ændret i C99) er
> det tilladt at tildele en enum en heltalsværdi
> Days = 12;
> hvilket ikke er tilladt i C++.
>

Men hvorfor har de vise fædre til C++ bestemt at man ikke må det?

Så vidt jeg kan se er der ikke flere problemer med den metode end
med alternativerne.

I mellemtiden har jeg forsøgt at lave en operator, noget i stil med

WeekDay operator ++ (WeekDay &d)
{
return WeekDay(++int(d));
}

Men det vil Borland og MS VC++ ikke oversætte. Min evner rækker
ikke til at lave noget der både kan oversættes og virker

Så jeg må vist leve med:
for(Day = Monday; Day < Numdays; Day = WeekDay(int(Day) + 1))

Hvilket ikke er særlig kønt.

/b

Mogens Hansen (21-05-2004)
Kommentar
Fra : Mogens Hansen


Dato : 21-05-04 21:45


"Bertel Brander" <bertel@post4.tele.dk> wrote:

[8<8<8<]
> Men hvorfor har de vise fædre til C++ bestemt at man ikke må det?

På grund af at _pointere_ til 2 forskelle enum er forskellige type i C, og
det vil give problemer med funktions overload hvis ikke også hver enum blev
gjort til en separat type.

Det er beskrevet i
The Design and Evolution of C++
Bjarne Stroustrup
ISBN 0-201-54330-3
side 253-254.

Der bliver så vidt jeg kan se arbejdet på at forbedre enum i næste version
af C++.
Se f.eks. http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1579.pdf

[8<8<8<]
> Men det vil Borland og MS VC++ ikke oversætte. Min evner rækker
> ikke til at lave noget der både kan oversættes og virker
>
> Så jeg må vist leve med:
> for(Day = Monday; Day < Numdays; Day = WeekDay(int(Day) + 1))

Du kan lave en type der gør hvad du ønsker.
Følgende oversætter både med Microsoft Visual C++ .NET 2003 og Borland
C++Builder 6

<C++ kode>
#include <iostream>

class week_day
{
public:
static const week_day monday, tuesday, wednesday,
thursday, friday,
saturday, sunday, end;
static const week_day& begin;

week_day(const week_day& week_day_arg) :
value(week_day_arg.value) {}

bool operator==(const week_day& week_day_arg) const
{ return week_day_arg.value == value; }
bool operator!=(const week_day& week_day_arg) const
{ return !operator==(week_day_arg); }
week_day& operator++()
{
if(end_ != value)
value = week_day_(value+1);
return *this;
}

private:
friend std::ostream& operator<<(std::ostream&, const week_day&);
enum week_day_ {
monday_, tuesday_, wednesday_,
thursday_, friday_,
saturday_, sunday_, end_
} value;
week_day(week_day_ value_arg) :
value(value_arg) {}
};

std::ostream& operator<<(std::ostream& os, const week_day& wd)
{
static const char* week_day_text[] =
{ "monday", "tuesday", "wednesday", "thursday",
"friday", "saturday", "sunday", "end"
};
os << week_day_text[wd.value];
return os;
}

const week_day week_day::monday(week_day::monday_),
week_day::tuesday(week_day::tuesday_),
week_day::wednesday(week_day::wednesday_),
week_day::thursday(week_day::thursday_),
week_day::friday(week_day::friday_),
week_day::saturday(week_day::saturday_),
week_day::sunday(week_day::sunday_),
week_day::end(week_day::end_);
const week_day& week_day::begin = week_day::monday;

int main()
{
using namespace std;

for(week_day wd = week_day::begin; week_day::end != wd; ++wd)
cout << wd << endl;
}
</C++ kode>

Venlig hilsen

Mogens Hansen



Bertel Brander (21-05-2004)
Kommentar
Fra : Bertel Brander


Dato : 21-05-04 23:18

Mogens Hansen wrote:
>
> Der bliver så vidt jeg kan se arbejdet på at forbedre enum i næste version
> af C++.
> Se f.eks. http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1579.pdf

Jeg er glad for at jeg ikke er den eneste der ikke er helt tilfreds med
enums i C++.

>
>
> Du kan lave en type der gør hvad du ønsker.
> Følgende oversætter både med Microsoft Visual C++ .NET 2003 og Borland
> C++Builder 6
>
[Snip, et langt og godt eksempel]

Jeg spekulerer stadig på om det er muligt at lave en simpel operator
funktion.

/b

Bjarne Stroustrup (22-05-2004)
Kommentar
Fra : Bjarne Stroustrup


Dato : 22-05-04 02:49

Bertel Brander <bertel@post4.tele.dk> wrote in message news:<40ae8024$0$131$edfadb0f@dread11.news.tele.dk>...
> Mogens Hansen wrote:
> >
> > Der bliver så vidt jeg kan se arbejdet på at forbedre enum i næste version
> > af C++.
> > Se f.eks. http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1579.pdf
>
> Jeg er glad for at jeg ikke er den eneste der ikke er helt tilfreds med
> enums i C++.
>
> >
> >
> > Du kan lave en type der gør hvad du ønsker.
> > Følgende oversætter både med Microsoft Visual C++ .NET 2003 og Borland
> > C++Builder 6
> >
> [Snip, et langt og godt eksempel]
>
> Jeg spekulerer stadig på om det er muligt at lave en simpel operator
> funktion.

Hvor simpelt er simpelt nok? F.eks.

enum Month { jan, feb, .... dec };
Month& operator++(Month& m) { return m=(m==dec)?jan:Month(m+1); }

enum var "half baked" helt fra begyndelsen, og det virkelige problem
med at forbedre dem er at der er mange forskellive idder om hvad de
skulle vaere.

-- Bjarne Stroustrup; http://www.research.att.com/~bs

Bertel Brander (22-05-2004)
Kommentar
Fra : Bertel Brander


Dato : 22-05-04 13:14

Bjarne Stroustrup wrote:
>
> Hvor simpelt er simpelt nok? F.eks.
>
> enum Month { jan, feb, .... dec };
> Month& operator++(Month& m) { return m=(m==dec)?jan:Month(m+1); }

Ja, det er dejligt simpelt, tak.

Man burde jo så kunne lave en postfix operator (der ikke har
"wrap around") med:

Month operator ++ (Month& m,int) { Month t = m; m = Month(int(m)+1);
return t; }

(Det er dog for mig lidt af en gåde hvorfor man skal putte den
extra int ind for at få en postfix.)

>
> enum var "half baked" helt fra begyndelsen, og det virkelige problem
> med at forbedre dem er at der er mange forskellive idder om hvad de
> skulle vaere.
>

Jeg stoler på at I/man finder en løsning.

/b

Per Abrahamsen (21-05-2004)
Kommentar
Fra : Per Abrahamsen


Dato : 21-05-04 19:29

Bertel Brander <bertel@post4.tele.dk> writes:

> Hvorfor er følgende ikke et gyldigt C++ program, når
> det er et gyldigt C program?
>
> enum WeekDay
> {
> Monday, Tuesday, Wednesday, Thursday,
> Friday, Saturday, Sunday, Numdays
> };
>
> int main()
> {
> enum WeekDay Day;
> for(Day = Monday; Day < Numdays; Day++)
> ;
> return 0;
> }
>
> Der er Days++ den ikke vil oversætte.
>
> Jeg ved godt at der er andre måder at lave det på,
> men jeg synes ikke der er noget galt med ovenstående
> metode.

Fordi folkene bag C++ dummede sig da de lavede semantikken for enums.
Det er en god ide at de gjorde enums til en separat type. Men de
burde have givet den type samme semantik som pointere i forhold til
heltal:

enum + enum -> fejl
enum + int -> enum
enum - enum -> int

På den måde ville man have kunne bruge enums som iteratorer, ligesom
man kan med pointere.

Bjarne Stroustrup (22-05-2004)
Kommentar
Fra : Bjarne Stroustrup


Dato : 22-05-04 02:57

Per Abrahamsen <abraham@dina.kvl.dk> wrote in message news:<rjvfipfxcn.fsf@sheridan.dina.kvl.dk>...
>
> Fordi folkene bag C++ dummede sig da de lavede semantikken for enums.

Jeg kan vidst ikke dele rosen eller risene for C++'s enum. De var
lavet langt foer standards kommitteen blev startet.

> Det er en god ide at de gjorde enums til en separat type. Men de
> burde have givet den type samme semantik som pointere i forhold til
> heltal:
>
> enum + enum -> fejl
> enum + int -> enum
> enum - enum -> int
>
> På den måde ville man have kunne bruge enums som iteratorer, ligesom
> man kan med pointere.

Det er *en* brug af enums. Der er folk der haevder at det er helt
klart at enums skal "wrap around" ligesom unsigned int, og andre der
haeveder at det er helt klart at man skal kaste en exception naar en
enum gaar out of range.

Saa vidt jeg kan see, er det eneste der er helt sikkert er at folk er
enige om at C++ enums ikke er helt rigtige og at folk er meget uenige
om hvad der ville vaere bedre. Snart faar vi se hvad kommitteen kan
enes om.

-- Bjarne Stroustrup; http://www.research.att.com/~bs

Per Abrahamsen (23-05-2004)
Kommentar
Fra : Per Abrahamsen


Dato : 23-05-04 13:39

bs@research.att.com (Bjarne Stroustrup) writes:

> Det er *en* brug af enums. Der er folk der haevder at det er helt
> klart at enums skal "wrap around" ligesom unsigned int, og andre der
> haeveder at det er helt klart at man skal kaste en exception naar en
> enum gaar out of range.

Jeg håber at hvad I end finder ud af ikke involverer at man skal
begynde at bekymre sig om et "abstraction penalty" for at bruge
enums...

Bjarne Stroustrup (23-05-2004)
Kommentar
Fra : Bjarne Stroustrup


Dato : 23-05-04 21:53

Per Abrahamsen <abraham@dina.kvl.dk> wrote in message news:<rjoeofmi6w.fsf@sheridan.dina.kvl.dk>...
> bs@research.att.com (Bjarne Stroustrup) writes:
>
> > Det er *en* brug af enums. Der er folk der haevder at det er helt
> > klart at enums skal "wrap around" ligesom unsigned int, og andre der
> > haeveder at det er helt klart at man skal kaste en exception naar en
> > enum gaar out of range.
>
> Jeg håber at hvad I end finder ud af ikke involverer at man skal
> begynde at bekymre sig om et "abstraction penalty" for at bruge
> enums...

Det haaber jeg ogsaa

-- Bjarne

Søg
Reklame
Statistik
Spørgsmål : 177580
Tips : 31968
Nyheder : 719565
Indlæg : 6409079
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste