The amazing for...while() construct




  • You know that common C dilemma people have? How to prevent a "for" loop from rebelliously over-running the boundaries you set it? Well I picked up this cunning solution from my co-workers code:

    for (int i=0; i<nMaxValue; i++)
    {
       do_stuff();
    }
    while(false);

    That last statement makes all the difference, really.
     



  • @cheesemonkey said:


    You know that common C dilemma people have? How to prevent a "for" loop from rebelliously over-running the boundaries you set it? Well I picked up this cunning solution from my co-workers code:

    for (int i=0; i<nMaxValue; i++)
    {
       do_stuff();
    }
    while(false);

    That last statement makes all the difference, really.
     

     

    Cool - I wouldn't even have thought that this might compile...? 


  • Discourse touched me in a no-no place

    @tdittmar said:

    @cheesemonkey said:


    You know that common C dilemma people have? How to prevent a "for" loop from rebelliously over-running the boundaries you set it? Well I picked up this cunning solution from my co-workers code:

    for (int i=0; i<nMaxValue; i++)
    {
       do_stuff();
    }
    while(false);

    That last statement makes all the difference, really.
     

     

    Cool - I wouldn't even have thought that this might compile...? 

    Why ever not? There's nothing (syntactically) wrong with it. Would some more redundancy help you? Replace the last semicolon with an empty block:



    for (int i=0; i<nMaxValue; i++)
    {
       do_stuff();
    }
    while(false)

    {

      /* do nothing. */

    }

     



  • @PJH said:

    @tdittmar said:

    @cheesemonkey said:

    You know that common C dilemma people have? How to prevent a "for" loop from rebelliously over-running the boundaries you set it? Well I picked up this cunning solution from my co-workers code:

    for (int i=0; i<nMaxValue; i++)
    {
       do_stuff();
    }
    while(false);

    That last statement makes all the difference, really.

     

    Cool - I wouldn't even have thought that this might compile...? 

    Why ever not? There's nothing (syntactically) wrong with it. Would some more redundancy help you? Replace the last semicolon with an empty block:


    for (int i=0; i<nMaxValue; i++)
    {
       do_stuff();
    }
    while(false)

    {

      /* do nothing. */

    }
     

    Oh right, you're correct. I somehow interpreted the while to belong to the for loop. Something like "loop from 0 to nMaxValue while false". You know, like the "do { ... } while...;" loop only with the "do" replaced by "for (...)". 



  • That's what's wrong with the code! The while is outside the for loop, and there's nothing inside the while!

    for (int i=0; i<nMaxValue; i++)
    {
    do_stuff();
    while (false)
    {
    break;
    }
    }

    See? That works much better! </sarcasm>



  • @Erick said:

    That's what's wrong with the code! The while is outside the for loop, and there's nothing inside the while!

    for (int i=0; i<nMaxValue; i++)
    {
    do_stuff();
    while (false)
    {
    break;
    }
    }

    See? That works much better!

     

    Genius! Thanks for this I'll let my co-worker know.



  • @Erick said:

    That's what's wrong with the code! The while is outside the for loop, and there's nothing inside the while!

    for (int i=0; i<nMaxValue; i++)
    {
    do_stuff();
    while (false)
    {
    break;
    }
    }

    See? That works much better!

    LOL Good when being paid per Lines Of Code



  • @tdittmar said:

    @Erick said:

    That's what's wrong with the code! The while is outside the for loop, and there's nothing inside the while!

    for (int i=0; i<nMaxValue; i++)
    {
    do_stuff();
    while (false)
    {
    break;
    }
    }

    See? That works much better!

    LOL Good when being paid per Lines Of Code

    Nobody who is paid per line would ever use a for loop.

    /* Enterprise looping strategy */
    bool done;
    int i;
    i = 0;
    done = false;
    while (!done) {
      assert(i < nMaxValue);
      do_stuff();
    
      int next;
      next = i + 1;
      assert(next <= nMaxValue)
      if (next == nMaxValue) {
        done = true;
        break;
      }
      else {
        assert(next < nMaxValue);
        i = next;
        continue;
      }
    }


  • @asuffield said:

    @tdittmar said:

    @Erick said:

    That's what's wrong with the code! The while is outside the for loop, and there's nothing inside the while!

    for (int i=0; i<nMaxValue; i++)
    {
    do_stuff();
    while (false)
    {
    break;
    }
    }

    See? That works much better!

    LOL Good when being paid per Lines Of Code

    Nobody who is paid per line would ever use a for loop.

    /* Enterprise looping strategy */
    bool done;
    int i;
    i = 0;
    done = false;
    while (!done) {
      assert(i < nMaxValue);
      do_stuff();
    
      int next;
      next = i + 1;
      assert(next <= nMaxValue)
      if (next == nMaxValue) {
        done = true;
        break;
      }
      else {
        assert(next < nMaxValue);
        i = next;
        continue;
      }
    }

     

    It lacks Looper and LoopFactory classes.



  • I just wrote this as a joke, but now I feel all dirty inside.

     
    public static class LoopFactory
    {
        public static LoopInstance GetLoopInstance(int start, int end, LoopInstance.CompareType comparer)
        {
            ///More Enterprisy code here
            return new LoopInstance(start);
        }
    }

    public class LoopInstance
    {
        public enum CompareType
        {
            Greater,
            Lesser,
            Equals,
            FILE_NOT_FOUND
        }

        private int _count;

        public int Count
        {
            get
            {
                return _count;
            }
            set
            {
                _count = value;
            }
        }
       
        public LoopInstance()
        {
            Count = 0;
        }

        public LoopInstance(int start)
        {
            Count = start;
        }

        public Boolean Compare(int compareTo, CompareType comparer)
        {
            if (comparer = CompareType.Greater)
            {
                if (compareTo > Count)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            else if (comparer = CompareType.Lesser)
            {
                if (compareTo < Count)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            else if (comparer = CompareType.Equals)
            {
                if (compareTo == Count)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            else
            {
                return false;
            }
        }
    }



  •  You should be programming to an interface, not an implementation.  Make LoopInstance an interface, and create a class called LoopInstanceImpl to implement it.  You'll get an extra 20 lines of code out of that.



  • Please, just stop. You're making me weep for the future.


  • Discourse touched me in a no-no place

    @asuffield said:

    @tdittmar said:

    *LOL* Good when being paid per Lines Of Code

    Nobody who is paid per line would ever use a for loop.

    /* Enterprise looping strategy */
    bool done;
    int i;
    i = 0;
    done = false;
    while (!done) {
      assert(i < nMaxValue);
      do_stuff();
    

    int next;
    next = i + 1;
    assert(next <= nMaxValue)
    if (next == nMaxValue) {
    done = true;
    break;
    }
    else {
    assert(next < nMaxValue);
    i = next;
    continue;
    }
    }

    The fact that, that code, appeared all on one lne in the email notification sorta detracted from it's purpose.



  • @PJH said:

     The fact that, that code, appeared all on one lne in the email notification sorta detracted from it's purpose.

     

    It seems that the forum software is still the real WTF. A pre block explicitly means "DO NOT REFORMAT THIS YOU BLITHERING MORON", and they managed to reformat it. 



  • ausffield, if you're getting paid for LOC, you probably should put your opening braces on the next line.



  • I'm assuming that it's a not-completely-retarded LOC counter, and so is counting actual statements rather than newline characters. Otherwise there are going to be a lot of blank lines and comments.



  • @Jonathan Holland said:

    wrote this as a joke, but now I feel all dirty inside.


    public static class LoopFactory
    {
        public static LoopInstance GetLoopInstance(int start, int end, LoopInstance.CompareType comparer)
        {
            ///More Enterprisy code here
            return new LoopInstance(start);
        }
    }

    public class LoopInstance
    {
        public enum CompareType
        {
            Greater,
            Lesser,
            Equals,
            FILE_NOT_FOUND
        }

        private int _count;

        public int Count
        {
            get
            {
                return _count;
            }
            set
            {
                _count = value;
            }
        }
       
        public LoopInstance()
        {
            Count = 0;
        }

        public LoopInstance(int start)
        {
            Count = start;
        }

        public Boolean Compare(int compareTo, CompareType comparer)
        {
            if (comparer = CompareType.Greater)
            {
                if (compareTo > Count)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            else if (comparer = CompareType.Lesser)
            {
                if (compareTo < Count)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            else if (comparer = CompareType.Equals)
            {
                if (compareTo == Count)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            else
            {
                return false;
            }
        }
    }

    Nice!  This reminds me of a game we used to play in college: who can be more stupid? I always won. Wait, did that mean that I lost?



  • @asuffield said:

    It seems that the forum software is still the real WTF. A pre block explicitly means "DO NOT REFORMAT THIS YOU BLITHERING MORON", and they managed to reformat it.
    It's just that plain-text notifications are completely broken (they're missing all linefeeds). Switch to HTML, and it'll kinda work (though they randomly refer to images on server through their relative path).



  • @Jonathan Holland said:

    if (comparer = CompareType.Greater)

    else if (comparer = CompareType.Lesser)

    else if (comparer = CompareType.Equals)

    if (compareTo == Count)

    ...one of these is not like the others (though it's the only one that will compile)



  • @Jonathan Holland said:

    wrote this as a joke, but now I feel all dirty inside.

    ...

    The code appears to only manage loop state, nothing more. Can't you use a delegate to have the class actually run the loop code for you?


Log in to reply
 

Looks like your connection to What the Daily WTF? was lost, please wait while we try to reconnect.