By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
445,797 Members | 1,794 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 445,797 IT Pros & Developers. It's quick & easy.

weird FOR LOOP problem

P: n/a
Bo
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"?
Jul 19 '05 #1
Share this Question
Share on Google+
14 Replies


P: n/a
"Bo" <sn*****@hotmail.com> wrote in message
news:4f**************************@posting.google.c om...
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.
Jul 19 '05 #2

P: n/a
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
Jul 19 '05 #3

P: n/a
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
Jul 19 '05 #4

P: n/a
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
Jul 19 '05 #5

P: n/a
"Bo" <sn*****@hotmail.com> wrote in message
news:4f**************************@posting.google.c om...

[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
Jul 19 '05 #6

P: n/a
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


Jul 19 '05 #7

P: n/a
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
Jul 19 '05 #8

P: n/a
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

Jul 19 '05 #9

P: n/a
Bo
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" <sg*******@dial.pipex.com> wrote in message news:<3f***********************@news.dial.pipex.co m>...
"Bo" <sn*****@hotmail.com> wrote in message
news:4f**************************@posting.google.c om...
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.

Jul 19 '05 #10

P: n/a
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.

Jul 19 '05 #11

P: n/a

Ron Natalie <ro*@sensor.com> wrote in message
news:3f***********************@news.newshosting.co m...

"Bo" <sn*****@hotmail.com> wrote in message

news:4f**************************@posting.google.c om...
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

Jul 19 '05 #12

P: n/a
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
Jul 19 '05 #13

P: n/a
"Bo" <sn*****@hotmail.com> wrote in message
news:4f**************************@posting.google.c om...
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.

Jul 19 '05 #14

P: n/a
"Dave O'Hearn" <da******@pobox.com> wrote in message
news:3e**************************@posting.google.c om...
sn*****@hotmail.com (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

Jul 19 '05 #15

This discussion thread is closed

Replies have been disabled for this discussion.