Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   C++ (http://www.velocityreviews.com/forums/f39-c.html)
-   -   Problem with an enum in a switch statement (http://www.velocityreviews.com/forums/t951860-problem-with-an-enum-in-a-switch-statement.html)

army1987 09-05-2012 07:38 PM

Problem with an enum in a switch statement
 
I have two types `eParticleType` and `Particle` defined as
enum eParticleType {
eNull,
eNucleus,
eMuon,
eElectron,
eProton,
eNeutron,
ePhoton,
eNeutrino,
ePion
};
class Particle {
public:
// lots of stuff
private:
eParticleType fType;
// more stuff
};
and a function defined as
std::vector<Particle> PropagateParticle(Particle* input) {

std::vector<Particle> output;
// stuff

switch(fType) {

case eNeutron:

case eProton:

case eNucleus:

output = PropagateNucleus(input);

break;

case eNeutrino:

output = PropagateNeutrino(input);

break;

// etc.
default:

std::cerr << "Unsupported particle type" << std::endl;

abort();

}
// stuff

return output;

}
(Each of the `PropagateXxx` functions has `assert(input->GetType() ==
eXxx;` at the beginning.)


When I compile this with g++, I get "warning: case label value exceeds
maximum value for type", and when I run the program I immediately get
"Assertion `input->GetType() == eMuon' failed.". What's going on? (And
no, I'd rather not have stuff like `class Nucleus: public Particle` etc.
for backward compatibility reasons.)



--
[ T H I S S P A C E I S F O R R E N T ]
Troppo poca cultura ci rende ignoranti, troppa ci rende folli.
-- fathermckenzie di it.cultura.linguistica.italiano
<http://xkcd.com/397/>

army1987 09-05-2012 07:47 PM

Re: Problem with an enum in a switch statement
 
On Wed, 05 Sep 2012 19:38:31 +0000, army1987 wrote:
[snip]
> When I compile this with g++, I get "warning: case label value exceeds
> maximum value for type", and when I run the program I immediately get
> "Assertion `input->GetType() == eMuon' failed.". What's going on? (And
> no, I'd rather not have stuff like `class Nucleus: public Particle` etc.
> for backward compatibility reasons.)


Never mind, I've just realized that the function from which I was trying
to use the private member `fType` wasn't itself a member of `class
Particle`, so I was using the fType of another class.



--
[ T H I S S P A C E I S F O R R E N T ]
Troppo poca cultura ci rende ignoranti, troppa ci rende folli.
-- fathermckenzie di it.cultura.linguistica.italiano
<http://xkcd.com/397/>

Victor Bazarov 09-05-2012 07:51 PM

Re: Problem with an enum in a switch statement
 
On 9/5/2012 3:38 PM, army1987 wrote:
> I have two types `eParticleType` and `Particle` defined as
> enum eParticleType {
> eNull,
> eNucleus,
> eMuon,
> eElectron,
> eProton,
> eNeutron,
> ePhoton,
> eNeutrino,
> ePion
> };
> class Particle {
> public:
> // lots of stuff
> private:
> eParticleType fType;
> // more stuff
> };
> and a function defined as
> std::vector<Particle> PropagateParticle(Particle* input) {


Is that a member function? Because if it is, then it needs to be
defined slightly differently, probably:

std::vector<Particle> Particle::PropagateParticle( ...

And if it isn't, then what's "fType" in it?

>
> std::vector<Particle> output;
> // stuff
>
> switch(fType) {
>
> case eNeutron:
>
> case eProton:
>
> case eNucleus:
>
> output = PropagateNucleus(input);
>
> break;
>
> case eNeutrino:
>
> output = PropagateNeutrino(input);
>
> break;
>
> // etc.
> default:
>
> std::cerr << "Unsupported particle type" << std::endl;
>
> abort();
>
> }
> // stuff
>
> return output;
>
> }
> (Each of the `PropagateXxx` functions has `assert(input->GetType() ==
> eXxx;` at the beginning.)
>
>
> When I compile this with g++, I get "warning: case label value exceeds
> maximum value for type", and when I run the program I immediately get
> "Assertion `input->GetType() == eMuon' failed.". What's going on? (And
> no, I'd rather not have stuff like `class Nucleus: public Particle` etc.
> for backward compatibility reasons.)


See FAQ 5.8 and follow its recommendations.

V
--
I do not respond to top-posted replies, please don't ask


All times are GMT. The time now is 07:27 PM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.