For Programmers: Free Programming Magazines  


Home > Archive > C > October 2005 > enum question









You are viewing an archived Text-only version of the thread. To view this thread in it's original format and/or if you want to reply to this thread please [click here]

 

Author enum question
James Brown

2005-10-22, 6:55 pm

I have the following enum declared:

enum TOKEN { TOK_ID = 1000, TOK_NUMBER, TOK_STRING };

(it goes on and on like that)

This is what I would like to do:

TOKEN t1 = TOK_ID; // ok
TOKEN t2 = 5; // compile error (cannot convert from
const int to 'enum TOKEN')
TOKEN t3 = (TOKEN)5; // compiles but I think it's illegal???

could someone clarify if the 3rd example is ok or not, and what type
of problem I might expect if it isn't ok?

What I am trying to do is represent ASCII values 0-127 as TOKENs (this is
why I
started the TOKEN enum off at '1000' so I had plenty of space at the
start....and I don't
really want to type out 127 values into my enum declaration....can anybody
suggest
an alternate solution?

thanks,
James


Chad

2005-10-22, 6:55 pm


James Brown wrote:
> I have the following enum declared:
>
> enum TOKEN { TOK_ID = 1000, TOK_NUMBER, TOK_STRING };
>
> (it goes on and on like that)
>
> This is what I would like to do:
>
> TOKEN t1 = TOK_ID; // ok
> TOKEN t2 = 5; // compile error (cannot convert from
> const int to 'enum TOKEN')
> TOKEN t3 = (TOKEN)5; // compiles but I think it's illegal???
>
> could someone clarify if the 3rd example is ok or not, and what type
> of problem I might expect if it isn't ok?
>
> What I am trying to do is represent ASCII values 0-127 as TOKENs (this is
> why I
> started the TOKEN enum off at '1000' so I had plenty of space at the
> start....and I don't
> really want to type out 127 values into my enum declaration....can anybody
> suggest
> an alternate solution?
>
> thanks,
> James


In the expression:

enum TOKEN { TOK_ID = 1000, TOK_NUMBER, TOK_STRING };

TOK_ID, TOK_NUMBER, and TOK_STRING are constant integer values. In this
case, TOK_ID is = 1000, then TOK_NUMBER is 1001. The reason why the
compiler is b-tching is because you are trying to modify the constant
integer TOK_NUMBER (which has a value of 1001).

Keith Thompson

2005-10-22, 6:55 pm

"James Brown" <dont_bother> writes:
> I have the following enum declared:
>
> enum TOKEN { TOK_ID = 1000, TOK_NUMBER, TOK_STRING };
>
> (it goes on and on like that)
>
> This is what I would like to do:
>
> TOKEN t1 = TOK_ID; // ok
> TOKEN t2 = 5; // compile error (cannot convert from
> const int to 'enum TOKEN')
> TOKEN t3 = (TOKEN)5; // compiles but I think it's illegal???
>
> could someone clarify if the 3rd example is ok or not, and what type
> of problem I might expect if it isn't ok?


The declaration "enum TOKEN { ... };" creates a type called
"enum TOKEN". It does not create a type called TOKEN.

Given the type declaration, the declaration
enum TOKEN t2 = 5;
is perfectly legal.

I suspect you're using a C++ compiler. C++ is a different language
with different rules; comp.lang.c++ is down the hall on the left.

--
Keith Thompson (The_Other_Keith) kst-u@mib.org <http://www.ghoti.net/~kst>
San Diego Supercomputer Center <*> <http://users.sdsc.edu/~kst>
We must do something. This is something. Therefore, we must do this.
Keith Thompson

2005-10-22, 6:55 pm

"Chad" <cdalten@gmail.com> writes:
> James Brown wrote:
>
> In the expression:
>
> enum TOKEN { TOK_ID = 1000, TOK_NUMBER, TOK_STRING };


That's a declaration, not an expression.

> TOK_ID, TOK_NUMBER, and TOK_STRING are constant integer values. In this
> case, TOK_ID is = 1000, then TOK_NUMBER is 1001.


Yes.

> The reason why the
> compiler is b-tching is because you are trying to modify the constant
> integer TOK_NUMBER (which has a value of 1001).


Look again. There's nothing in the original poster's code that
attempts to modify TOK_NUMBER.

--
Keith Thompson (The_Other_Keith) kst-u@mib.org <http://www.ghoti.net/~kst>
San Diego Supercomputer Center <*> <http://users.sdsc.edu/~kst>
We must do something. This is something. Therefore, we must do this.
Chad

2005-10-22, 6:55 pm


Keith Thompson wrote:
> "James Brown" <dont_bother> writes:
>
> The declaration "enum TOKEN { ... };" creates a type called
> "enum TOKEN". It does not create a type called TOKEN.
>
> Given the type declaration, the declaration
> enum TOKEN t2 = 5;
> is perfectly legal.
>
> I suspect you're using a C++ compiler. C++ is a different language
> with different rules; comp.lang.c++ is down the hall on the left.
>
> --
> Keith Thompson (The_Other_Keith) kst-u@mib.org <http://www.ghoti.net/~kst>
> San Diego Supercomputer Center <*> <http://users.sdsc.edu/~kst>
> We must do something. This is something. Therefore, we must do this.


I'm calling an offsides on this one. Maybe I mis-understood the
question. I always thought when you has a construction like

enum TOKEN { TOK_ID = 1000, TOK_NUMBER, TOK_STRING };

Then TOK_NUMBER = 1001 and TOK_STRING = 1002. Both of these being
constant integers (Page 39 of the "C Programming Language" by K & R).
Hence these values could not be modified because they are constant.

Michael Mair

2005-10-22, 6:55 pm

Chad wrote:
> Keith Thompson wrote:
>
>
> I'm calling an offsides on this one. Maybe I mis-understood the
> question. I always thought when you has a construction like
>
> enum TOKEN { TOK_ID = 1000, TOK_NUMBER, TOK_STRING };
>
> Then TOK_NUMBER = 1001 and TOK_STRING = 1002. Both of these being
> constant integers (Page 39 of the "C Programming Language" by K & R).
> Hence these values could not be modified because they are constant.


I am not sure what you mean.
The
enum TOKEN {
....
};
declaration gives us the type "enum TOKEN", quite like
struct foo {
....
};
gives us the type "struct foo".

So,
enum TOKEN t2;
t2 = 5;
or
enum TOKEN t2 = 5;
are structurally not different from
struct foo bar;
bar = baz;
or
struct foo bar = baz;
where baz is of type struct foo.

Declaring t2 certainly does not change any of the enumeration
constants, neither does initializing t2.


Cheers
Michael
--
E-Mail: Mine is an /at/ gmx /dot/ de address.
James Brown

2005-10-22, 6:55 pm




"Keith Thompson" <kst-u@mib.org> wrote in message
news:lnvezpe1g2.fsf@nuthaus.mib.org...
> "James Brown" <dont_bother> writes:
>
> The declaration "enum TOKEN { ... };" creates a type called
> "enum TOKEN". It does not create a type called TOKEN.
>
> Given the type declaration, the declaration
> enum TOKEN t2 = 5;
> is perfectly legal.
>
> I suspect you're using a C++ compiler. C++ is a different language
> with different rules; comp.lang.c++ is down the hall on the left.
>
> --
> Keith Thompson (The_Other_Keith) kst-u@mib.org
> <http://www.ghoti.net/~kst>
> San Diego Supercomputer Center <*>
> <http://users.sdsc.edu/~kst>
> We must do something. This is something. Therefore, we must do this.


Hi,
thanks for your answer - and you're right, I am using C++ but its useful for
me
to appreciate the differences....I'll repost on c.l.c++

thanks,
James


Keith Thompson

2005-10-22, 9:55 pm

"Chad" <cdalten@gmail.com> writes:
> Keith Thompson wrote:
[...][color=darkred]
> I'm calling an offsides on this one. Maybe I mis-understood the
> question. I always thought when you has a construction like
>
> enum TOKEN { TOK_ID = 1000, TOK_NUMBER, TOK_STRING };
>
> Then TOK_NUMBER = 1001 and TOK_STRING = 1002. Both of these being
> constant integers (Page 39 of the "C Programming Language" by K & R).
> Hence these values could not be modified because they are constant.


Of course you can't modify TOK_NUMBER or TOK_STRING.

The posted code (see above) doesn't attempt to do so, and I don't see
anything that would lead you to believe that it does.

--
Keith Thompson (The_Other_Keith) kst-u@mib.org <http://www.ghoti.net/~kst>
San Diego Supercomputer Center <*> <http://users.sdsc.edu/~kst>
We must do something. This is something. Therefore, we must do this.
Emmanuel Delahaye

2005-10-30, 6:56 pm

James Brown a écrit :
> enum TOKEN { TOK_ID = 1000, TOK_NUMBER, TOK_STRING };
>
> TOKEN t1 = TOK_ID; // ok
> TOKEN t2 = 5; // compile error (cannot convert from
> const int to 'enum TOKEN')


Be sure you are using a C compiler. The C-language is not that strongly
typed. This line is fine C.

> TOKEN t3 = (TOKEN)5; // compiles but I think it's illegal???


It's fine C too.

--
C is a sharp tool
Eric Sosman

2005-10-31, 7:55 am

Emmanuel Delahaye wrote:
> James Brown a écrit :
>
>
>
> Be sure you are using a C compiler. The C-language is not that strongly
> typed. This line is fine C.
>
>
>
> It's fine C too.


Ah. This is obviously some strange usage of the word
"fine" that I wasn't previously aware of.

enum TOKEN { TOK_ID = 1000, TOK_NUMBER, TOK_STRING };
TOKEN t1 = TOK_ID;
TOKEN t2 = 5;
TOKEN t3 = (TOKEN)5;

gcc -W -Wall -ansi -pedantic -c token.c
token.c:2: error: parse error before "t1"
token.c:2: warning: type defaults to `int' in declaration of `t1'
token.c:2: error: ISO C forbids data definition with no type or storage
class
token.c:3: error: parse error before "t2"
token.c:3: warning: type defaults to `int' in declaration of `t2'
token.c:3: error: ISO C forbids data definition with no type or storage
class
token.c:4: error: parse error before "t3"
token.c:4: warning: type defaults to `int' in declaration of `t3'
token.c:4: error: `TOKEN' undeclared here (not in a function)
token.c:4: error: parse error before numeric constant

--
Eric Sosman
esosman@acm-dot-org.invalid
Emmanuel Delahaye

2005-10-31, 6:56 pm

Eric Sosman a écrit :
>
> Ah. This is obviously some strange usage of the word
> "fine" that I wasn't previously aware of.


Ah sh*t, I missed the 'enum' word... Sorry about that.

--
C is a sharp tool
Sponsored Links







Also available: Server administration forum archive | Web Design forum archive | Software forum archive | Hardware reviews archive

Copyright 2008 codecomments.com