There is no "continue" for switch?

Discussion in 'C++' started by xz, Mar 18, 2008.

  1. xz

    xz Guest

    What if I want the following:

    vector<int> v;

    // v is loaded by push_back()

    switch( v.size() ) {
    case 2:
    //do something

    case 4:
    //somehow delete two element
    //and then do the same thing as in case 2

    case 6:
    //somehow delete two element
    //and then do the same thing as in case 4

    default:
    //...
    }


    I thought using "continue" to implement this but got this:

    continue statement not within a loop
     
    xz, Mar 18, 2008
    #1
    1. Advertising

  2. xz

    Jerry Coffin Guest

    In article <7864a589-19a7-458d-99cd-
    >,
    says...
    > What if I want the following:
    >
    > vector<int> v;
    >
    > // v is loaded by push_back()
    >
    > switch( v.size() ) {
    > case 2:
    > //do something
    >
    > case 4:
    > //somehow delete two element
    > //and then do the same thing as in case 2
    >
    > case 6:
    > //somehow delete two element
    > //and then do the same thing as in case 4
    >
    > default:
    > //...
    > }


    Correct -- continue works for loops by not switches. Fortunately you
    don't need anything quite that difficult:

    switch (v.size()) {
    case 6:
    // somehow delete two element (sic)
    case 4:
    // somehow delete two element
    case 2:
    // do something
    }

    If there isn't a break at the end of a block, execution will flow
    through to the next block...

    --
    Later,
    Jerry.

    The universe is a figment of its own imagination.
     
    Jerry Coffin, Mar 18, 2008
    #2
    1. Advertising

  3. xz

    Junchen WANG Guest

    On 3ÔÂ18ÈÕ, ÏÂÎç11ʱ46·Ö, xz <> wrote:
    > What if I want the following:
    >
    > vector<int> v;
    >
    > // v is loaded by push_back()
    >
    > switch( v.size() ) {
    > case 2:
    > //do something
    >
    > case 4:
    > //somehow delete two element
    > //and then do the same thing as in case 2
    >
    > case 6:
    > //somehow delete two element
    > //and then do the same thing as in case 4
    >
    > default:
    > //...
    >
    > }
    >
    > I thought using "continue" to implement this but got this:
    >
    > continue statement not within a loop


    please detail your intent.
     
    Junchen WANG, Mar 18, 2008
    #3
  4. xz

    xz Guest

    On Mar 18, 10:57 am, Jerry Coffin <> wrote:
    > In article <7864a589-19a7-458d-99cd-
    > >,
    > says...
    >
    >
    >
    > > What if I want the following:

    >
    > > vector<int> v;

    >
    > > // v is loaded by push_back()

    >
    > > switch( v.size() ) {
    > > case 2:
    > > //do something

    >
    > > case 4:
    > > //somehow delete two element
    > > //and then do the same thing as in case 2

    >
    > > case 6:
    > > //somehow delete two element
    > > //and then do the same thing as in case 4

    >
    > > default:
    > > //...
    > > }

    >
    > Correct -- continue works for loops by not switches. Fortunately you
    > don't need anything quite that difficult:
    >
    > switch (v.size()) {
    > case 6:
    > // somehow delete two element (sic)
    > case 4:
    > // somehow delete two element
    > case 2:
    > // do something
    >
    > }
    >
    > If there isn't a break at the end of a block, execution will flow
    > through to the next block...

    well, I gave a case not so tough, what if a case a little tougher?

    vector<int> v;

    // v is loaded by push_back()

    switch( v.size() ) {
    case 2:
    //do something

    case 4:
    //somehow delete two element
    //and then do the same thing as in case 2

    case 6:
    //somehow delete *four* element
    //and then do the same thing as in case 2

    default:
    //...

    }

    i.e. I want to go to case 2 both after I treat the case 4 and case 6.


    >
    > --
    > Later,
    > Jerry.
    >
    > The universe is a figment of its own imagination.
     
    xz, Mar 18, 2008
    #4
  5. xz

    Junchen WANG Guest

    On 3ÔÂ19ÈÕ, ÉÏÎç12ʱ21·Ö, xz <> wrote:
    > On Mar 18, 10:57 am, Jerry Coffin <> wrote:
    >
    >
    >
    > > In article <7864a589-19a7-458d-99cd-
    > > >,
    > > says...

    >
    > > > What if I want the following:

    >
    > > > vector<int> v;

    >
    > > > // v is loaded by push_back()

    >
    > > > switch( v.size() ) {
    > > > case 2:
    > > > //do something

    >
    > > > case 4:
    > > > //somehow delete two element
    > > > //and then do the same thing as in case 2

    >
    > > > case 6:
    > > > //somehow delete two element
    > > > //and then do the same thing as in case 4

    >
    > > > default:
    > > > //...
    > > > }

    >
    > > Correct -- continue works for loops by not switches. Fortunately you
    > > don't need anything quite that difficult:

    >
    > > switch (v.size()) {
    > > case 6:
    > > // somehow delete two element (sic)
    > > case 4:
    > > // somehow delete two element
    > > case 2:
    > > // do something

    >
    > > }

    >
    > > If there isn't a break at the end of a block, execution will flow
    > > through to the next block...

    >
    > well, I gave a case not so tough, what if a case a little tougher?
    >
    > vector<int> v;
    >
    > // v is loaded by push_back()
    >
    > switch( v.size() ) {
    > case 2:
    > //do something
    >
    > case 4:
    > //somehow delete two element
    > //and then do the same thing as in case 2
    >
    > case 6:
    > //somehow delete *four* element
    > //and then do the same thing as in case 2
    >
    > default:
    > //...
    >
    > }
    >
    > i.e. I want to go to case 2 both after I treat the case 4 and case 6.
    >
    >
    >
    >
    >
    > > --
    > > Later,
    > > Jerry.

    >
    > > The universe is a figment of its own imagination.- Òþ²Ø±»ÒýÓÃÎÄ×Ö -

    >
    > - ÏÔʾÒýÓõÄÎÄ×Ö -- Òþ²Ø±»ÒýÓÃÎÄ×Ö -
    >
    > - ÏÔʾÒýÓõÄÎÄ×Ö -


    void f()
    {
    // do something
    }

    ....
    vector<int> v;


    // v is loaded by push_back()


    switch( v.size() ) {
    case 2:
    f();//do something
    break;


    case 4:
    //somehow delete two element
    f();//and then do the same thing as in case 2
    break;


    case 6:
    //somehow delete *four* element
    f();//and then do the same thing as in case 2
    break;

    default:
    //...
    }
     
    Junchen WANG, Mar 18, 2008
    #5
  6. xz

    Christopher Guest


    > well, I gave a case not so tough, what if a case a little tougher?
    >
    > vector<int> v;
    >
    > // v is loaded by push_back()


    while(v.size() != 2)
    {

    > switch( v.size() ) {
    > case 2:
    > //do something
    >
    > case 4:
    > //somehow delete two element
    > //and then do the same thing as in case 2
    >
    > case 6:
    > //somehow delete *four* element
    > //and then do the same thing as in case 2
    >
    > default:
    > //...
    >
    > }


    }

    > i.e. I want to go to case 2 both after I treat the case 4 and case 6.



    Or if you _always_ want to delete elements until the size is 2, I
    wouldn't use a switch at all.

    while(v.size() != 2)
    {
    // Determine which element to delete
    // delete it
    }
     
    Christopher, Mar 18, 2008
    #6
  7. xz wrote:
    > What if I want the following:
    >
    > vector<int> v;
    >
    > // v is loaded by push_back()
    >
    > switch( v.size() ) {
    > case 2:
    > //do something
    >
    > case 4:
    > //somehow delete two element
    > //and then do the same thing as in case 2
    >
    > case 6:
    > //somehow delete two element
    > //and then do the same thing as in case 4
    >
    > default:
    > //...
    > }
    >
    >
    > I thought using "continue" to implement this but got this:
    >
    > continue statement not within a loop


    I believe you should rearrange your clauses and make '6' and
    '4' fall through to the '2':

    switch (v.size()) {
    case 6:
    // somehow delete 2 elements
    // and FALL THROUGH
    case 4:
    // somehow delete 2 elements
    // and FALL THROUGH
    case 2:
    // do something
    break; // Yes, only here

    default:
    //...
    }

    V
    --
    Please remove capital 'A's when replying by e-mail
    I do not respond to top-posted replies, please don't ask
     
    Victor Bazarov, Mar 18, 2008
    #7
  8. xz wrote:

    > What if I want the following:
    >
    > vector<int> v;
    >
    > // v is loaded by push_back()
    >
    > switch( v.size() ) {
    > case 2:
    > //do something
    >
    > case 4:
    > //somehow delete two element
    > //and then do the same thing as in case 2
    >
    > case 6:
    > //somehow delete two element
    > //and then do the same thing as in case 4
    >
    > default:
    > //...
    > }
    >
    >
    > I thought using "continue" to implement this but got this:
    >
    > continue statement not within a loop


    Of course there is a continue for switch (for your example else-thread):

    #include <iostream>

    void f(uint8_t n)
    {
    std::cout << n << '\n';
    switch(n) {
    for(;;) {
    case 2:
    std::cout << "do_something\n";
    break;
    case 4:
    std::cout << "somehow delete 2 elements\n";
    continue;
    case 6:
    std::cout << "somehow delete 4 elements\n";
    continue;
    default:
    std::cout << "default\n";
    break;
    }
    }
    }

    int main()
    {
    f(2);
    f(4);
    f(6);
    f(1);
    }

    HTH,
    Paul
     
    Paul Brettschneider, Mar 18, 2008
    #8
  9. Paul Brettschneider wrote:

    > xz wrote:
    >
    >> What if I want the following:
    >>
    >> vector<int> v;
    >>
    >> // v is loaded by push_back()
    >>
    >> switch( v.size() ) {
    >> case 2:
    >> //do something
    >>
    >> case 4:
    >> //somehow delete two element
    >> //and then do the same thing as in case 2
    >>
    >> case 6:
    >> //somehow delete two element
    >> //and then do the same thing as in case 4
    >>
    >> default:
    >> //...
    >> }
    >>
    >>
    >> I thought using "continue" to implement this but got this:
    >>
    >> continue statement not within a loop

    >
    > Of course there is a continue for switch (for your example else-thread):
    >
    > #include <iostream>
    >
    > void f(uint8_t n)
    > {
    > std::cout << n << '\n';
    > switch(n) {
    > for(;;) {
    > case 2:
    > std::cout << "do_something\n";
    > break;
    > case 4:
    > std::cout << "somehow delete 2 elements\n";
    > continue;
    > case 6:
    > std::cout << "somehow delete 4 elements\n";
    > continue;
    > default:
    > std::cout << "default\n";
    > break;
    > }
    > }
    > }
    >
    > int main()
    > {
    > f(2);
    > f(4);
    > f(6);
    > f(1);
    > }


    Of course this doesn't do what you what it to do - it doesn't recompute the
    label to jump to. Sorry, I'm tired.
     
    Paul Brettschneider, Mar 18, 2008
    #9
  10. Paul Brettschneider wrote:

    > Paul Brettschneider wrote:
    >
    >> xz wrote:
    >>
    >>> What if I want the following:
    >>>
    >>> vector<int> v;
    >>>
    >>> // v is loaded by push_back()
    >>>
    >>> switch( v.size() ) {
    >>> case 2:
    >>> //do something
    >>>
    >>> case 4:
    >>> //somehow delete two element
    >>> //and then do the same thing as in case 2
    >>>
    >>> case 6:
    >>> //somehow delete two element
    >>> //and then do the same thing as in case 4
    >>>
    >>> default:
    >>> //...
    >>> }
    >>>
    >>>
    >>> I thought using "continue" to implement this but got this:
    >>>
    >>> continue statement not within a loop

    >>
    >> Of course there is a continue for switch (for your example else-thread):
    >>
    >> #include <iostream>
    >>
    >> void f(uint8_t n)
    >> {
    >> std::cout << n << '\n';
    >> switch(n) {
    >> for(;;) {
    >> case 2:
    >> std::cout << "do_something\n";
    >> break;
    >> case 4:
    >> std::cout << "somehow delete 2 elements\n";
    >> continue;
    >> case 6:
    >> std::cout << "somehow delete 4 elements\n";
    >> continue;
    >> default:
    >> std::cout << "default\n";
    >> break;
    >> }
    >> }
    >> }
    >>
    >> int main()
    >> {
    >> f(2);
    >> f(4);
    >> f(6);
    >> f(1);
    >> }

    >
    > Of course this doesn't do what you what it to do - it doesn't recompute
    > the label to jump to. Sorry, I'm tired.


    Here is the correct solution (I think):

    #include <iostream>

    void f(int n)
    {
    std::cout << n << '\n';
    for(;;) {
    switch(n) {
    case 2:
    std::cout << "do_something\n";
    break;
    case 4:
    std::cout << "somehow delete 2 elements\n";
    n -= 2;
    continue;
    case 6:
    std::cout << "somehow delete 4 elements\n";
    n -= 4;
    continue;
    default:
    std::cout << "default\n";
    break;
    }
    break;
    }
    }

    int main()
    {
    f(2);
    f(4);
    f(6);
    f(1);
    }
     
    Paul Brettschneider, Mar 18, 2008
    #10
  11. xz

    Jerry Coffin Guest

    In article <01db3ce8-2e5e-470d-a892-
    >, says...

    [ ... ]

    > well, I gave a case not so tough, what if a case a little tougher?
    >
    > vector<int> v;
    >
    > // v is loaded by push_back()
    >
    > switch( v.size() ) {
    > case 2:
    > //do something
    >
    > case 4:
    > //somehow delete two element
    > //and then do the same thing as in case 2
    >
    > case 6:
    > //somehow delete *four* element
    > //and then do the same thing as in case 2
    >
    > default:
    > //...
    >
    > }
    >
    > i.e. I want to go to case 2 both after I treat the case 4 and case 6.


    Truth to tell, I doubt I'd use switch at all for this. Rather, I'd do
    something like this:

    if (x == 2 || x == 4 || x == 6) {
    v.erase(v.begin()+2, v.begin()+x-2);
    // do something
    }
    else
    // whatever was in your default.

    Of course, you'll probably need to make minor changes to account for the
    position in the vector where you want to do the deletion.

    --
    Later,
    Jerry.

    The universe is a figment of its own imagination.
     
    Jerry Coffin, Mar 19, 2008
    #11
  12. On Mar 19, 2:46 am, xz <> wrote:
    > What if I want the following:
    >
    > vector<int> v;
    >
    > // v is loaded by push_back()
    >
    > switch( v.size() ) {
    > case 2:
    > //do something
    >
    > case 4:
    > //somehow delete two element
    > //and then do the same thing as in case 2
    >
    > case 6:
    > //somehow delete two element
    > //and then do the same thing as in case 4
    >
    > default:
    > //...
    >
    > }
    >
    > I thought using "continue" to implement this but got this:
    >
    > continue statement not within a loop


    Hi Zhang,

    It seems you wanna to something like spaghetti code can do. Are you
    originally from Basic language? =) I think Junchen's approach is a
    right way to do it.

    Cheers,
    Alex
     
    Alexander Dong Back Kim, Mar 19, 2008
    #12
  13. On Mar 19, 9:32 am, Paul Brettschneider <>
    wrote:
    > xz wrote:
    > > What if I want the following:

    >
    > > vector<int> v;

    >
    > > // v is loaded by push_back()

    >
    > > switch( v.size() ) {
    > > case 2:
    > > //do something

    >
    > > case 4:
    > > //somehow delete two element
    > > //and then do the same thing as in case 2

    >
    > > case 6:
    > > //somehow delete two element
    > > //and then do the same thing as in case 4

    >
    > > default:
    > > //...
    > > }

    >
    > > I thought using "continue" to implement this but got this:

    >
    > > continue statement not within a loop

    >
    > Of course there is a continue for switch (for your example else-thread):
    >
    > #include <iostream>
    >
    > void f(uint8_t n)
    > {
    > std::cout << n << '\n';
    > switch(n) {
    > for(;;) {
    > case 2:
    > std::cout << "do_something\n";
    > break;
    > case 4:
    > std::cout << "somehow delete 2 elements\n";
    > continue;
    > case 6:
    > std::cout << "somehow delete 4 elements\n";
    > continue;
    > default:
    > std::cout << "default\n";
    > break;
    > }
    > }
    >
    > }
    >
    > int main()
    > {
    > f(2);
    > f(4);
    > f(6);
    > f(1);
    >
    > }
    >
    > HTH,
    > Paul


    I didn't know that ;)

    Cheers,
     
    Alexander Dong Back Kim, Mar 19, 2008
    #13
  14. xz

    Guest

    On Mar 18, 6:42 pm, Paul Brettschneider <>
    wrote:
    > Paul Brettschneider wrote:
    > Here is the correct solution (I think):


    Yes; it works. Although I think using "goto" would have actually been
    clearer here... at least with goto you know that it's going to jump
    somewhere and you have to look for a label; whereas with your solution
    I found that I first consulted the standard to verify that "continue"
    was not for "switch" before looking very closely to see the "for (;;)"
    hidden in there.


    Jason


    >
    > #include <iostream>
    >
    > void f(int n)
    > {
    > std::cout << n << '\n';
    > for(;;) {
    > switch(n) {
    > case 2:
    > std::cout << "do_something\n";
    > break;
    > case 4:
    > std::cout << "somehow delete 2 elements\n";
    > n -= 2;
    > continue;
    > case 6:
    > std::cout << "somehow delete 4 elements\n";
    > n -= 4;
    > continue;
    > default:
    > std::cout << "default\n";
    > break;
    > }
    > break;
    > }
    >
    > }
    >
    > int main()
    > {
    > f(2);
    > f(4);
    > f(6);
    > f(1);
    >
    > }
     
    , Mar 19, 2008
    #14
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Christopher Benson-Manica

    switch/continue

    Christopher Benson-Manica, Jun 7, 2004, in forum: C Programming
    Replies:
    4
    Views:
    13,324
    Alan Balmer
    Jun 8, 2004
  2. Beemer Biker

    [newbie] is there an OnServerError continue?

    Beemer Biker, Nov 3, 2006, in forum: ASP .Net
    Replies:
    1
    Views:
    282
    =?Utf-8?B?TmV2ZXJseW4=?=
    Nov 6, 2006
  3. v4vijayakumar

    continue with switch

    v4vijayakumar, May 12, 2006, in forum: C Programming
    Replies:
    25
    Views:
    981
    Herbert Rosenau
    May 13, 2006
  4. Krister Svanlund
    Replies:
    4
    Views:
    699
    Ryan Kelly
    Feb 21, 2010
  5. Francois Grieu
    Replies:
    55
    Views:
    1,415
    James Kuyper
    Jul 30, 2011
Loading...

Share This Page