weird FOR LOOP problem

B

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"?
 
S

Stuart Golodetz

Bo said:
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.
 
A

Attila Feher

Buster said:
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.

Yes what?
Why are you telling us this?

Because he needs help?
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?
 
A

Attila Feher

Bo said:
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.
 
A

Attila Feher

Attila said:
Bo said:
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.
 
B

Buster Copley

Attila said:
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.
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.
Because he needs help?

Then he shouldn't post this nonsense code for no reason then ask an
unrelated and off-topic question.
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?
 
W

White Wolf

Buster Copley wrote:
[SNIP]
Then he shouldn't post this nonsense code for no reason then ask an
unrelated and off-topic question.

Because he need help?
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.
 
B

Buster Copley

White said:
Buster Copley wrote:
[SNIP]
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.
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
 
K

Kevin Goodsell

Bo said:
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
 
B

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.
 
M

Mike Wahler

Ron Natalie said:
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
 
A

Attila Feher

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 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.
 
S

Stuart Golodetz

Bo said:
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).
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,011
Latest member
AjaUqq1950

Latest Threads

Top