keep splitting the atom question

Discussion in 'C++' started by Angus, Sep 25, 2007.

  1. Angus

    Angus Guest

    Hello

    I am writing a sampling type program which takes a buffer, and picks
    the middle of the buffer. But I need to take a bit out the middle and
    then take what is left (on both sides) and take the middle out of
    these fragments.

    I have a function which takes a range, eg start, end and a samplesize
    and calculates the range of the buffer to take for sampling. But of
    course each time I call this function it creates two new start-end
    ranges to again get the middle bit again. I have a size of sample so
    when the middle bits reach the sample size I just stop.

    How would I write something to achieve this? Should it be a recursive
    function?
     
    Angus, Sep 25, 2007
    #1
    1. Advertising

  2. Angus

    Jim Langston Guest

    "Angus" <> wrote in message
    news:...
    > Hello
    >
    > I am writing a sampling type program which takes a buffer, and picks
    > the middle of the buffer. But I need to take a bit out the middle and
    > then take what is left (on both sides) and take the middle out of
    > these fragments.
    >
    > I have a function which takes a range, eg start, end and a samplesize
    > and calculates the range of the buffer to take for sampling. But of
    > course each time I call this function it creates two new start-end
    > ranges to again get the middle bit again. I have a size of sample so
    > when the middle bits reach the sample size I just stop.
    >
    > How would I write something to achieve this? Should it be a recursive
    > function?


    I'd probably do it recursively. This is more a programming question than a
    C++ quesiton though.
     
    Jim Langston, Sep 25, 2007
    #2
    1. Advertising

  3. On 2007-09-25 12:28, Angus wrote:
    > Hello
    >
    > I am writing a sampling type program which takes a buffer, and picks
    > the middle of the buffer. But I need to take a bit out the middle and
    > then take what is left (on both sides) and take the middle out of
    > these fragments.
    >
    > I have a function which takes a range, eg start, end and a samplesize
    > and calculates the range of the buffer to take for sampling. But of
    > course each time I call this function it creates two new start-end
    > ranges to again get the middle bit again. I have a size of sample so
    > when the middle bits reach the sample size I just stop.
    >
    > How would I write something to achieve this? Should it be a recursive
    > function?



    Recursive is probably a good idea. However for these kinds of questions
    please consult comp.programming instead.

    --
    Erik Wikström
     
    =?UTF-8?B?RXJpayBXaWtzdHLDtm0=?=, Sep 25, 2007
    #3
  4. Angus wrote:
    > I am writing a sampling type program which takes a buffer, and picks
    > the middle of the buffer. But I need to take a bit out the middle


    What does that mean "to take a bit out the middle"?

    > and
    > then take what is left (on both sides) and take the middle out of
    > these fragments.


    And then what? When does it end, and what do you expect as the result
    of that processing?

    > I have a function which takes a range, eg start, end and a samplesize
    > and calculates the range of the buffer to take for sampling. But of
    > course each time I call this function it creates two new start-end
    > ranges to again get the middle bit again. I have a size of sample so
    > when the middle bits reach the sample size I just stop.
    >
    > How would I write something to achieve this? Should it be a recursive
    > function?


    Yes, the recursion seems to fit right in.

    template<class Iterator, class F>
    void doSomethingWithTheMiddle(Iterator start, Iterator end, F f)
    {
    if (start != end) { // not an empty range
    Iterator middle = start + (start - end)/2;
    f(*middle);
    doSomethingWithTheMiddle(start, middle);
    doSomethingWithTheMiddle(middle, end);
    }
    }

    The function above has a flaw -- it will recurse infinitely for a range
    of length 1. You need to correct it. Hint: you need to add 1 addition
    somewhere.

    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, Sep 25, 2007
    #4
  5. Angus

    Howard Guest

    >
    > template<class Iterator, class F>
    > void doSomethingWithTheMiddle(Iterator start, Iterator end, F f)
    > {
    > if (start != end) { // not an empty range
    > Iterator middle = start + (start - end)/2;


    Did you mean:

    = start + (end-start)/2; // which equals (start+end)/2

    ?

    > f(*middle);
    > doSomethingWithTheMiddle(start, middle);
    > doSomethingWithTheMiddle(middle, end);
    > }
    > }
    >


    -Howard
     
    Howard, Sep 28, 2007
    #5
  6. Howard wrote:
    >> template<class Iterator, class F>
    >> void doSomethingWithTheMiddle(Iterator start, Iterator end, F f)
    >> {
    >> if (start != end) { // not an empty range
    >> Iterator middle = start + (start - end)/2;

    >
    > Did you mean:
    >
    > = start + (end-start)/2; // which equals (start+end)/2
    >
    > ?


    Yes, of course. However, the expression in your comment cannot
    be substituted. For iterators a difference is often defined,
    whereas a sum isn't. Think pointers, for example. You can
    subtract one from the other and get a ptrdiff_t value, but you
    can't add one pointer to another, it just doesn't make sense.

    >
    >> f(*middle);
    >> doSomethingWithTheMiddle(start, middle);
    >> doSomethingWithTheMiddle(middle, end);
    >> }
    >> }
    >>

    >
    > -Howard


    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, Sep 28, 2007
    #6
  7. Angus

    Howard Guest

    "Victor Bazarov" <> wrote in message
    news:fdi3ud$jha$...
    > Howard wrote:
    >>> template<class Iterator, class F>
    >>> void doSomethingWithTheMiddle(Iterator start, Iterator end, F f)
    >>> {
    >>> if (start != end) { // not an empty range
    >>> Iterator middle = start + (start - end)/2;

    >>
    >> Did you mean:
    >>
    >> = start + (end-start)/2; // which equals (start+end)/2
    >>
    >> ?

    >
    > Yes, of course. However, the expression in your comment cannot
    > be substituted. For iterators a difference is often defined,
    > whereas a sum isn't. Think pointers, for example. You can
    > subtract one from the other and get a ptrdiff_t value, but you
    > can't add one pointer to another, it just doesn't make sense.
    >


    I thought that was the case. That's why I put it in a comment, not in code.
    Thanks for clarifying.
    -Howard
     
    Howard, Sep 29, 2007
    #7
    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.

Share This Page