What could the compiler be possibly complaining about

P

parag_paul

Are there any compiler groups.
Though I try it in this language forum
I got the following message for the following line in a c file

if (logic_value_change == p_variable_info->vc_reason &&
p_variable_info->p_value->logic_value <4 &&
p_variable_info->p_value->logic_value>=0)



The message is
.../star186559.c: In function `func_var':
.../star186559.c:320: warning: comparison is always true due to limited
range of data type



comparison is always true ????

The data type fpr logic_value is a unsigned char
-Parag
 
R

Richard Heathfield

(e-mail address removed) said:
Are there any compiler groups.

Yes, but you don't need one for this question, which is about the C
language.
Though I try it in this language forum
I got the following message for the following line in a c file

if (logic_value_change == p_variable_info->vc_reason &&
p_variable_info->p_value->logic_value <4 &&
p_variable_info->p_value->logic_value>=0)

The message is
../star186559.c: In function `func_var':
../star186559.c:320: warning: comparison is always true due to limited
range of data type

comparison is always true ????
Yes.

The data type fpr logic_value is a unsigned char

An unsigned char cannot hold negative values. It can only hold values in
the range 0 to UCHAR_MAX, which is guaranteed to be a positive integer
value that is at least 255 (but is higher on some systems).

The comparison you have is: p_variable_info->p_value->logic_value>=0

Now, *any* unsigned char value *must* have a value greater than or equal to
0, by definition. Therefore, the comparison >= 0 will always yield true
for an unsigned char, which is exactly what the compiler is (correctly)
telling you.
 
M

Martin Ambuhl

Are there any compiler groups.
Though I try it in this language forum
I got the following message for the following line in a c file

if (logic_value_change == p_variable_info->vc_reason &&
p_variable_info->p_value->logic_value <4 &&
p_variable_info->p_value->logic_value>=0)
The message is
.../star186559.c: In function `func_var':
.../star186559.c:320: warning: comparison is always true due to limited
range of data type
comparison is always true ????
The data type fpr logic_value is a unsigned char

The comparison
p_variable_info->p_value->logic_value>=0)
is obviously always true if logic_value is an unsigned char.
An unsigned char cannot be less than zero.
 
F

Falcon Kirtaran

Are there any compiler groups.
Though I try it in this language forum
I got the following message for the following line in a c file

if (logic_value_change == p_variable_info->vc_reason &&
p_variable_info->p_value->logic_value <4 &&
p_variable_info->p_value->logic_value>=0)



The message is
../star186559.c: In function `func_var':
../star186559.c:320: warning: comparison is always true due to limited
range of data type



comparison is always true ????

The data type for logic_value is a unsigned char
-Parag

That warning sometimes comes up when you compare variables of different
sizes. To really know what you need to do differently, I'd need the
types of all the other variables you are comparing as well.

To illustrate what is happening here, consider an unsigned char.
Because it is only eight bytes long and can store values no larger than
255, if you write something like:

int function {
char a = 255;
if (a < 256) return 1;
};

The comparison will always be true and the function will always return 1.

As a point of practice, it's always a good idea to put parentheses
around the parts of a condition, eg:

if ( (logic_value_change == p_variable_info->vc_reason) &&
(p_variable_info->p_value->logic_value < 4) &&
(p_variable_info->p_value->logic_value >= 0) )

However, conveniently, the precedence of ==, <, and >= are all greater
than that of &&, so that shouldn't be your issue. -> trumps all of
those. I'm guessing that the issue is as simple as logic_value_change
and vc_reason having silly types.
 
F

Falcon Kirtaran

Falcon said:
That warning sometimes comes up when you compare variables of different
sizes. To really know what you need to do differently, I'd need the
types of all the other variables you are comparing as well.

To illustrate what is happening here, consider an unsigned char. Because
it is only eight bytes long and can store values no larger than 255, if
you write something like:

int function {
char a = 255;
if (a < 256) return 1;
};

The comparison will always be true and the function will always return 1.

As a point of practice, it's always a good idea to put parentheses
around the parts of a condition, eg:

if ( (logic_value_change == p_variable_info->vc_reason) &&
(p_variable_info->p_value->logic_value < 4) &&
(p_variable_info->p_value->logic_value >= 0) )

However, conveniently, the precedence of ==, <, and >= are all greater
than that of &&, so that shouldn't be your issue. -> trumps all of
those. I'm guessing that the issue is as simple as logic_value_change
and vc_reason having silly types.

Bah. Clearly, I am a fool. Your problem is "logic_value>=0" because
unsigned types can't contain negative numbers.
 

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

Forum statistics

Threads
473,995
Messages
2,570,226
Members
46,815
Latest member
treekmostly22

Latest Threads

Top