Register to reply

VC++ has gone crazy!

by sid_galt
Tags: crazy
Share this thread:
sid_galt
#1
Apr27-07, 06:27 AM
P: 712
My VC++ Express compiler has been acting very funnily of late.

I tried the following code

for(whatever)
{
double sum = whatever;

if(sum > 5.0)
    sum = 5
else if(sum < 1.0)
    sum = 1
}
The problem with this was that the program was now converting all the sum values generated into 1.0, even those which were greater than 1.0.

Instead of using the if statement, I tried the conditional operator and then it worked fine.


for(whatever)
{
double sum = whatever;

sum = sum > 5?  5:sum;
sum = sum < 1?  1:sum;
}//Working Okay
Does anyone know the reason for this discrepancy?
Phys.Org News Partner Science news on Phys.org
Experts defend operational earthquake forecasting, counter critiques
EU urged to convert TV frequencies to mobile broadband
Sierra Nevada freshwater runoff could drop 26 percent by 2100
daniel_i_l
#2
Apr27-07, 06:38 AM
PF Gold
daniel_i_l's Avatar
P: 867
Well for one thing, you forgot the ';' after sum=5 / sum=1 in the first code.
nabuco
#3
Apr27-07, 10:10 AM
P: n/a
Seriously, I think the problem must be in the "whatever" (the code you didn't post). Either that, or you found a bug in the compiler.

In any case, the code below would be far more elegant (C++ jargon for cryptic :-)

sum = (sum > 5) ? 5 : ((sum < 1) ? 1 : sum);

nightowl03d
#4
Apr27-07, 11:29 PM
P: 9
VC++ has gone crazy!

Quote Quote by nabuco View Post
Seriously, I think the problem must be in the "whatever" (the code you didn't post). Either that, or you found a bug in the compiler.

In any case, the code below would be far more elegant (C++ jargon for cryptic :-)

sum = (sum > 5) ? 5 : ((sum < 1) ? 1 : sum);
Most coding standards will fail nested ternary statements on code reviews. So try to keep it on your lab box. :-)
sid_galt
#5
Apr28-07, 12:43 PM
P: 712
Thanks for the replies.

Actually, the statements inside the for loop constitute an inline function. This inline function is what is actually called repeatedly through the for loop. The whatever is nothing but a simple for loop (int i = 0; i < ratingCount; i++)
I am getting another problem, this time both in VC++ and g++. I have created a structure -
typedef  unsigned char BYTE;

struct Data
{
short MovieId;
int CustId;
BYTE Rating;
float cache;
} rt;

cout<<sizeof(rt)<<endl;  //gives 16
cout<<sizeof(short)+sizeof(int)+sizeof(BYTE)+sizeof(float)<<endl; //correctly gives 11
When I use the sizeof() function to find out the size of the Data struct, it comes out to be 16 bytes instead of the 11 bytes it should be (2[short]+4[int]+1[BYTE aka char]+4[float]).
When I summed up the individual sizes of the variables inside the struct using sizeof(float), etc., the size was correctly coming to be 11 bytes.
nmtim
#6
Apr28-07, 01:46 PM
P: 79
Quote Quote by sid_galt View Post
Actually, the statements inside the for loop constitute an inline function.
I still don't really understand the code in your first post. Since you are facing a subtle, apparently compiler-dependent problem, you should post the code as written.
I am getting another problem, this time both in VC++ and g++. I have created a structure -
typedef  unsigned char BYTE;

struct Data
{
short MovieId;
int CustId;
BYTE Rating;
float cache;
} rt;

cout<<sizeof(rt)<<endl;  //gives 16
cout<<sizeof(short)+sizeof(int)+sizeof(BYTE)+sizeof(float)<<endl; //correctly gives 11
When I use the sizeof() function to find out the size of the Data struct, it comes out to be 16 bytes instead of the 11 bytes it should be (2[short]+4[int]+1[BYTE aka char]+4[float]).
When I summed up the individual sizes of the variables inside the struct using sizeof(float), etc., the size was correctly coming to be 11 bytes.
Almost certainly the float (and sounds like the int as well) has to be aligned on 4-byte boundaries. That means you have a 3 byte gap between the end of the char and the start of the float, etc. If you want you struct to have the smallest size, reorder the data elements so that the largest ones are first. This is a good rule to observe whenever coding a struct or class.
sid_galt
#7
Apr28-07, 02:19 PM
P: 712
Quote Quote by nmtim View Post
I still don't really understand the code in your first post. Since you are facing a subtle, apparently compiler-dependent problem, you should post the code as written.
for(i = 0; i < m_nRatingCount; i++)

			{

				movieId = rating->MovieId;

				custId = rating->CustId;



				p = predictRating(rating->cache, UserFactor[f][custId], MovieFactor[f][movieId]);

				err = rating->Rating - p;

				sq += err*err;



				cf = UserFactor[f][custId];

				mf = MovieFactor[f][movieId];



				UserFactor[f][custId] += (float)(LRATE * (err * mf - K * cf));

				MovieFactor[f][movieId] += (float)(LRATE * (err * cf - K * mf));

				rating++;

			}

inline double predictRating(float &cache, float &UserFactor, float &MovieFactor)

{

	double sum = 0;

	sum = cache + UserFactor * MovieFactor;



	sum = sum > 5 ? 5:sum;//  This works but if condition does not

	sum = sum < 1 ? 1:sum;



	return sum;

}
Almost certainly the float (and sounds like the int as well) has to be aligned on 4-byte boundaries. That means you have a 3 byte gap between the end of the char and the start of the float, etc. If you want you struct to have the smallest size, reorder the data elements so that the largest ones are first. This is a good rule to observe whenever coding a struct or class.
Wow, I never knew that. Happily it worked.


Register to reply

Related Discussions
Going crazy Academic Guidance 20
This is crazy! General Discussion 3
I'm going crazy Computing & Technology 7