weird FOR LOOP problem

Discussion in 'C++' started by Bo, Aug 21, 2003.

  1. Bo

    Bo Guest

    When I had this code, a and b's value never increases.

    for( int i=0, double a=0.0, double b=0.0 ; i<100; a+=0.1, b+=0.2 )
    {
    printf( "%s\n", i+a+b );
    }

    This works, however:

    double a=0.0, b=0.0;

    for( int i=0 ; i<100; a+=0.1, b+=0.2 )
    {
    printf( "%s\n", i+a+b );
    }

    I used visual c++ 6.0

    Damn it took me four hours to catch this. Of course, my original code
    is whole lot more complicated.

    Is there a way to print text to a console window even if your project
    is "win32 application"?
    Bo, Aug 21, 2003
    #1
    1. Advertising

  2. "Bo" <> wrote in message
    news:...
    > When I had this code, a and b's value never increases.
    >
    > for( int i=0, double a=0.0, double b=0.0 ; i<100; a+=0.1, b+=0.2 )
    > {
    > printf( "%s\n", i+a+b );
    > }


    It shouldn't even compile. On VC++ 6, it gives a warning (frankly, it should
    give an error, but it's better than nothing). Why did you ignore the
    following:

    warning C4518: 'double ' : storage-class or type specifier(s) unexpected
    here; ignored

    ?

    Just out of curiosity...

    FWIW, the reason the values never increase is that a and b are both of type
    int. If you add 0.1 to an int, what do you get? The same int back again,
    hence the problem you're experiencing.

    > This works, however:
    >
    > double a=0.0, b=0.0;
    >
    > for( int i=0 ; i<100; a+=0.1, b+=0.2 )
    > {
    > printf( "%s\n", i+a+b );
    > }


    It should do.

    > I used visual c++ 6.0
    >
    > Damn it took me four hours to catch this. Of course, my original code
    > is whole lot more complicated.


    And the moral of this story is: read compiler warnings, understand them, and
    act on them. If you can't find the bugs your compiler is telling you about,
    you'll never find the really nasty, obscure ones. The warnings are there for
    a reason (well, except the one about truncation of long identifiers in the
    debugger, which is a really pointless warning).

    > Is there a way to print text to a console window even if your project
    > is "win32 application"?


    Yes. It's entirely off-topic in a C++ language newsgroup, however. You want
    to ask this in microsoft.public.vc.language. FWIW:

    <OT>
    Look up "CreateConsoleScreenBuffer" in MSDN and check out the related
    "Console Functions" (link at the bottom of the page).
    </OT>

    HTH,

    Stuart.
    Stuart Golodetz, Aug 21, 2003
    #2
    1. Advertising

  3. Bo

    Attila Feher Guest

    Buster Copley wrote:
    > Bo wrote:
    >> When I had this code, a and b's value never increases.
    >>
    >> for( int i=0, double a=0.0, double b=0.0 ; i<100; a+=0.1, b+=0.2 )
    >> {
    >> printf( "%s\n", i+a+b );
    >> }

    >
    > That's a syntax error.


    That is not a syntax error. It is a semantic error. i+a+b is not a string.
    But the C++ language syntax does not care about the format string.

    >> This works, however:
    >>
    >> double a=0.0, b=0.0;
    >>
    >> for( int i=0 ; i<100; a+=0.1, b+=0.2 )
    >> {
    >> printf( "%s\n", i+a+b );
    >> }

    >
    > Yes.


    Yes what?

    >> I used visual c++ 6.0
    >>
    >> Damn it took me four hours to catch this. Of course, my original code
    >> is whole lot more complicated.

    >
    > Why are you telling us this?


    Because he needs help?

    >> Is there a way to print text to a console window even if your project
    >> is "win32 application"?

    >
    > Who cares?


    Apparently you don't. So why don't you just go back to whatever you did
    before you came in here to insult people?

    --
    Attila aka WW
    Attila Feher, Aug 21, 2003
    #3
  4. Bo

    Attila Feher Guest

    Bo wrote:
    > When I had this code, a and b's value never increases.
    >
    > for( int i=0, double a=0.0, double b=0.0 ; i<100; a+=0.1, b+=0.2 )
    > {
    > printf( "%s\n", i+a+b );

    [SNIP]

    The type of the expression i+a+b is double. You try to print a string (type
    chat *). You are lucky it does not crash. Use the printf format
    appropriate for floating point numbers, not the %s.

    > Is there a way to print text to a console window even if your project
    > is "win32 application"?


    Please post this question to a Windows programming newsgroup. This one is
    only for the standard C++ language.

    --
    Attila aka WW
    Attila Feher, Aug 21, 2003
    #4
  5. Bo

    Attila Feher Guest

    Attila Feher wrote:
    > Bo wrote:
    >> When I had this code, a and b's value never increases.
    >>
    >> for( int i=0, double a=0.0, double b=0.0 ; i<100; a+=0.1, b+=0.2 )
    >> {
    >> printf( "%s\n", i+a+b );

    > [SNIP]
    >
    > The type of the expression i+a+b is double. You try to print a
    > string (type chat *). You are lucky it does not crash. Use the
    > printf format appropriate for floating point numbers, not the %s.


    Correction: Read Stuarts answer. I have apparently skipped the head of the
    for loop.

    --
    Attila aka WW
    Attila Feher, Aug 21, 2003
    #5
  6. Bo

    ES Kim Guest

    "Bo" <> wrote in message
    news:...

    [snip]

    > This works, however:
    >
    > double a=0.0, b=0.0;
    >
    > for( int i=0 ; i<100; a+=0.1, b+=0.2 )
    > {
    > printf( "%s\n", i+a+b );
    > }


    It works forever.

    [snip]

    --
    ES Kim
    ES Kim, Aug 21, 2003
    #6
  7. Attila Feher wrote:
    > Buster Copley wrote:
    >>Bo wrote:
    >>
    >>>When I had this code, a and b's value never increases.
    >>>
    >>>for( int i=0, double a=0.0, double b=0.0 ; i<100; a+=0.1, b+=0.2 )
    >>>{
    >>>printf( "%s\n", i+a+b );
    >>>}

    >>
    >>That's a syntax error.

    >
    > That is not a syntax error. It is a semantic error. i+a+b is not a string.
    > But the C++ language syntax does not care about the format string.


    The compiler knows the syntax of a declaration, though.

    >>>This works, however:
    >>>
    >>>double a=0.0, b=0.0;
    >>>
    >>>for( int i=0 ; i<100; a+=0.1, b+=0.2 )
    >>>{
    >>>printf( "%s\n", i+a+b );
    >>>}

    >>
    >>Yes.

    >
    > Yes what?


    Yes it works, I meant, although as ES Kim has pointed out, the loop
    variable is never incremented and the loop never exits.

    >>>I used visual c++ 6.0
    >>>
    >>>Damn it took me four hours to catch this. Of course, my original code
    >>>is whole lot more complicated.

    >>
    >>Why are you telling us this?

    >
    > Because he needs help?


    Then he shouldn't post this nonsense code for no reason then ask an
    unrelated and off-topic question.

    >>>Is there a way to print text to a console window even if your project
    >>>is "win32 application"?

    >>
    >>Who cares?

    >
    > Apparently you don't. So why don't you just go back to whatever you did
    > before you came in here to insult people?


    What insult, exactly?

    > --
    > Attila aka WW
    Buster Copley, Aug 21, 2003
    #7
  8. Bo

    White Wolf Guest

    Buster Copley wrote:
    [SNIP]
    >>> Why are you telling us this?

    >>
    >> Because he needs help?

    >
    > Then he shouldn't post this nonsense code for no reason then ask an
    > unrelated and off-topic question.


    Because he need help?

    >>>> Is there a way to print text to a console window even if your
    >>>> project
    >>>> is "win32 application"?
    >>>
    >>> Who cares?

    >>
    >> Apparently you don't. So why don't you just go back to whatever you
    >> did before you came in here to insult people?

    >
    > What insult, exactly?


    Read your lines again. And read the FAQ on how to respond to off-topic _if_
    you respond at all. So far it is the charter and the FAQ which tells what
    can be posted here.

    --
    WW aka Attila
    White Wolf, Aug 21, 2003
    #8
  9. [OT] weird FOR LOOP problem

    White Wolf wrote:
    > Buster Copley wrote:
    > [SNIP]
    >
    >>>>Why are you telling us this?
    >>>
    >>>Because he needs help?

    >>
    >>Then he shouldn't post this nonsense code for no reason then ask an
    >>unrelated and off-topic question.

    >
    >
    > Because he need help?


    As far as I can see the guy's a troll. His post is ridiculous, so I
    guess I did ridicule it a little. To the OP, if you were serious,
    sorry for my misinterpretation, and please read the FAQ before posting.

    Mr Feher, if you're still annoyed that I disagreed with your reply to
    another post today then say so. Otherwise calm down.

    >>>>>Is there a way to print text to a console window even if your
    >>>>>project
    >>>>>is "win32 application"?
    >>>>
    >>>>Who cares?
    >>>
    >>>Apparently you don't. So why don't you just go back to whatever you
    >>>did before you came in here to insult people?

    >>
    >>What insult, exactly?

    >
    > Read your lines again. And read the FAQ on how to respond to

    off-topic _if_
    > you respond at all.


    I read my lines, all four of them. I still don't see an insult.

    This newsgroup is a public forum. I'll write what I please. I thought
    "Who cares?" was appropriate for an off-topic question, even if it is
    supremely unhelpful. It's not much worse than "Do it yourself." [FAQ
    5.3]. "Go back to whatever you did before you came in here" I find
    offensive, but I support your right to say it if you must.

    > So far it is the charter and the FAQ which tells what
    > can be posted here.


    OK.
    Buster
    Buster Copley, Aug 21, 2003
    #9
  10. Bo wrote:
    > When I had this code, a and b's value never increases.
    >
    > for( int i=0, double a=0.0, double b=0.0 ; i<100; a+=0.1, b+=0.2 )
    > {
    > printf( "%s\n", i+a+b );
    > }


    As others have pointed out, there are numerous problems here.

    My advice is to not use printf at all. You clearly don't understand its
    use well enough to use it correctly. That's OK, most programmers don't.
    That's why most (all) programmers should use std::cout instead (unless
    they have a good reason not to).

    -Kevin
    --
    My email address is valid, but changes periodically.
    To contact me please use the address from a recent posting.
    Kevin Goodsell, Aug 21, 2003
    #10
  11. Bo

    Bo Guest

    yeah, I forgot the i++.

    Sorry for introducing these erraneously bad examples. Regardless of
    its erraneous syntax, I still don't see the for loop prob.

    Thanks.

    "Stuart Golodetz" <> wrote in message news:<3f44b21b$0$15040$>...
    > "Bo" <> wrote in message
    > news:...
    > > When I had this code, a and b's value never increases.
    > >
    > > for( int i=0, double a=0.0, double b=0.0 ; i<100; a+=0.1, b+=0.2 )
    > > {
    > > printf( "%s\n", i+a+b );
    > > }

    >
    > It shouldn't even compile. On VC++ 6, it gives a warning (frankly, it should
    > give an error, but it's better than nothing). Why did you ignore the
    > following:
    >
    > warning C4518: 'double ' : storage-class or type specifier(s) unexpected
    > here; ignored
    >
    > ?
    >
    > Just out of curiosity...
    >
    > FWIW, the reason the values never increase is that a and b are both of type
    > int. If you add 0.1 to an int, what do you get? The same int back again,
    > hence the problem you're experiencing.
    >
    > > This works, however:
    > >
    > > double a=0.0, b=0.0;
    > >
    > > for( int i=0 ; i<100; a+=0.1, b+=0.2 )
    > > {
    > > printf( "%s\n", i+a+b );
    > > }

    >
    > It should do.
    >
    > > I used visual c++ 6.0
    > >
    > > Damn it took me four hours to catch this. Of course, my original code
    > > is whole lot more complicated.

    >
    > And the moral of this story is: read compiler warnings, understand them, and
    > act on them. If you can't find the bugs your compiler is telling you about,
    > you'll never find the really nasty, obscure ones. The warnings are there for
    > a reason (well, except the one about truncation of long identifiers in the
    > debugger, which is a really pointless warning).
    >
    > > Is there a way to print text to a console window even if your project
    > > is "win32 application"?

    >
    > Yes. It's entirely off-topic in a C++ language newsgroup, however. You want
    > to ask this in microsoft.public.vc.language. FWIW:
    >
    > <OT>
    > Look up "CreateConsoleScreenBuffer" in MSDN and check out the related
    > "Console Functions" (link at the bottom of the page).
    > </OT>
    >
    > HTH,
    >
    > Stuart.
    Bo, Aug 21, 2003
    #11
  12. Bo

    Mike Wahler Guest

    Ron Natalie <> wrote in message
    news:3f453d89$0$17694$...
    >
    > "Bo" <> wrote in message

    news:...
    > > Actually, supposedly, a, b are double:
    > >
    > > for( int i=0, double a=0.0, double b=0.0 ; i<100; a+=0.1, b+=0.2 )
    > >
    > > Do you mean a, b are automatically converted to int because they were
    > > declared after "int i=0,"? (notice the comma)

    >
    > You can't do that in C++. You can only have one type in a declaration
    > statement. VC++ seems to just pitch the "double" that's syntactically
    > incorrect.


    My VC++ (6.0) bitches about it, and aborts translation.

    -Mike
    Mike Wahler, Aug 21, 2003
    #12
  13. Bo

    Attila Feher Guest

    Re: [OT] weird FOR LOOP problem

    Buster Copley wrote:
    [SNIP]
    > As far as I can see the guy's a troll.


    Then you have just fed one. Very clever.

    > His post is ridiculous, so I
    > guess I did ridicule it a little.


    You have way too much time on your hands.

    > To the OP, if you were serious,
    > sorry for my misinterpretation, and please read the FAQ before
    > posting.


    Instead of being mean (hostile), unhelpful and unpolite, why didn't you just
    tell the same (as the FAQ, as the Netiquette etc. dictates). Testosteron?
    Too much cofee?

    > Mr Feher, if you're still annoyed that I disagreed with your reply to
    > another post today then say so. Otherwise calm down.


    As I have already explained in another post: thanks, but no thanks. I do
    not need therapy from you. BTW I am not annoyed. Surprised - maybe.

    [SNIP]
    > I read my lines, all four of them. I still don't see an insult.


    They are unhelpful, uncessary and hostile for absolutely no reason.

    > This newsgroup is a public forum. I'll write what I please.


    Not quite. There is a charter, a FAQ etc. for this newsgroup. Anyway there
    is a question in my mind so I spit it out. I have not been able to use the
    newsgroup for a while. When did you elect yourself to be the most
    influential person in comp.lang.c++?

    > I thought
    > "Who cares?" was appropriate for an off-topic question,


    It was not. Read the FAQ.

    > even if it is supremely unhelpful.


    Your whole post is extremely unhelpful, waste of bandwidhh and every readers
    time.

    > It's not much worse than "Do it yourself.


    Much worse. The "Do it yourself" is about people apparently copy-pasting
    their assignment here and wait for an answer. Your humiliating words were
    (possibly) hitting a beginner who has done (possibly) nothing wrong, but
    being a beginner. If it was not one but a troll: you have just wasted your
    time to keep that troll alive by feeding it.

    >" [FAQ
    > 5.3]. "Go back to whatever you did before you came in here" I find
    > offensive, but I support your right to say it if you must.


    After an unhelpful and hostile post you came up with I thought that you must
    have just got here from abusing cats or something like that. So I have felt
    that my reminding you of your previous activities might save the community
    from such mean postings in the future by driving you back to the act where
    you can "first-hand" see the humiliation you cause by your mean words/act
    and not only imagine it.

    > > So far it is the charter and the FAQ which tells what
    > > can be posted here.

    >
    > OK.


    So read it and use it. And one other suggestion: try to keep that "petting
    on the back" or "Bo gives you therapy" part from your posts. First of all
    you fire way off target with your assumptions, second: it does not really
    belong to the topic of the newsgroup.

    --
    Attila aka WW
    Attila Feher, Aug 22, 2003
    #13
  14. "Bo" <> wrote in message
    news:...
    > Actually, supposedly, a, b are double:
    >
    > for( int i=0, double a=0.0, double b=0.0 ; i<100; a+=0.1, b+=0.2 )
    >
    > Do you mean a, b are automatically converted to int because they were
    > declared after "int i=0,"? (notice the comma)


    VC++ seems to be (strangely) ignoring "double", which is illegal in that
    context. You can't define two different types of variable in the first bit
    of a for loop. In other words, these are ok (if rather pointless, since they
    don't do anything in these examples :)):

    for(int i=0; i<10; ++i) {}
    for(double d=0; d<10; d+=0.1) {}

    but what you had above isn't.

    What VC++ is doing is treating what you wrote as if you'd written this:

    for(int i=0, a=0.0, b=0.0; i<100; a+=0.1, b+=0.2)

    > Sorry for introducing the line printf("%s\n", i+a+b). As I said my
    > original code is too complicated so I just used this line without much
    > thought. Regardless of its erraneous syntax, I still don't see the for
    > loop prob.


    Hopefully the above clarified things a bit? Incidentally, the syntax of the
    printf line isn't the problem, it's its semantics. In other words, it will
    compile, but it still won't work.

    HTH,

    Stuart.

    P.S. Apologies for taking a bit of a swipe at you in my original posting
    about not reading the compiler warning (looking back at my post, it didn't
    come across as entirely friendly :)) The advice about reading warnings is
    worth noting, nonetheless, you can catch a number of bugs that way (and
    avoid spending lots of time debugging).

    > Thanks.
    >
    >
    > > ?
    > >
    > > Just out of curiosity...
    > >
    > > FWIW, the reason the values never increase is that a and b are both of

    type
    > > int. If you add 0.1 to an int, what do you get? The same int back again,
    > > hence the problem you're experiencing.
    > >
    > > > This works, however:
    > > >
    > > > double a=0.0, b=0.0;
    > > >
    > > > for( int i=0 ; i<100; a+=0.1, b+=0.2 )
    > > > {
    > > > printf( "%s\n", i+a+b );
    > > > }

    > >
    > > It should do.
    > >
    > > > I used visual c++ 6.0
    > > >
    > > > Damn it took me four hours to catch this. Of course, my original code
    > > > is whole lot more complicated.

    > >
    > > And the moral of this story is: read compiler warnings, understand them,

    and
    > > act on them. If you can't find the bugs your compiler is telling you

    about,
    > > you'll never find the really nasty, obscure ones. The warnings are there

    for
    > > a reason (well, except the one about truncation of long identifiers in

    the
    > > debugger, which is a really pointless warning).
    > >
    > > > Is there a way to print text to a console window even if your project
    > > > is "win32 application"?

    > >
    > > Yes. It's entirely off-topic in a C++ language newsgroup, however. You

    want
    > > to ask this in microsoft.public.vc.language. FWIW:
    > >
    > > <OT>
    > > Look up "CreateConsoleScreenBuffer" in MSDN and check out the related
    > > "Console Functions" (link at the bottom of the page).
    > > </OT>
    > >
    > > HTH,
    > >
    > > Stuart.
    Stuart Golodetz, Aug 22, 2003
    #14
  15. "Dave O'Hearn" <> wrote in message
    news:...
    > (Bo) wrote:

    <snip>
    > In C++, it is usually easier to use iostreams, so you don't have to
    > remember the %d and %f things,
    >
    > #include <iostreams>


    ITYM: #include <iostream>

    HTH,

    Stuart.

    > // ... etc ...
    > std::cout << i << " " << a << " " << b << std::endl;
    >

    <snip>
    > --
    > Dave O'Hearn
    Stuart Golodetz, Aug 22, 2003
    #15
    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. dorayme
    Replies:
    1
    Views:
    604
    richard
    Jan 21, 2011
  2. richard
    Replies:
    0
    Views:
    572
    richard
    Jan 21, 2011
  3. richard
    Replies:
    0
    Views:
    607
    richard
    Jan 21, 2011
  4. will
    Replies:
    6
    Views:
    398
    Phrogz
    Dec 27, 2006
  5. Isaac Won
    Replies:
    9
    Views:
    354
    Ulrich Eckhardt
    Mar 4, 2013
Loading...

Share This Page