Getting the warning "cast to pointer from integer of different size" from the following code
Asked Answered
A

4

9

The code is:

           Push(size, (POINTER)(GetCar(i) == term_Null()? 0 : 1));

Here is the C code push returns ABC which is

 typedef POINTER  *ABC
 typedef void * POINTER
 ABC size;
 Push(ABC,POINTER);
 XYZ GetCar(int);
 typedef struct xyz *XYZ;
 XYZ term_Null(); 
 long int i;

What is the reason for the particular warning?

Armure answered 18/4, 2011 at 10:20 Comment(3)
is sizeof(int)==sizeof(void*) on your platform?Secondclass
no the size of int and size of void pointer ** are different. So i am using **long int.Armure
so what do you not understand about the message? you're casting an int to a pointer type, you know they have different sizes, and the message tells you that again. seems pretty clear, no?Secondclass
S
21

You can use intptr_t to ensure the integer has the same width as pointer. This way, you don't need to discover stuff about your specific platform, and it will work on another platform too (unlike the unsigned long solution).

#include <stdint.h>

Push(size, (POINTER)(intptr_t)(GetCar(i) == term_Null()? 0 : 1));

Taken from the C99 Standard:

7.18.1.4 Integer types capable of holding object pointers

1 The following type designates a signed integer type with the property that any valid pointer to void can be converted to this type, then converted back to pointer to void, and the result will compare equal to the original pointer:

intptr_t

Schaal answered 18/4, 2011 at 13:6 Comment(0)
A
0

What are you trying to do? Pointers are not integers, and you are trying to make a pointer out of 0 or 1, depending on the situation. That is illegal.


If you were trying to pass a pointer to a ABC containing 0 or 1, use this:

ABC tmp = GetCar(i) == term_Null()? 0 : 1;
Push(size, &tmp);
Acetal answered 18/4, 2011 at 10:26 Comment(4)
i did the one you mentioned here. but still i am getting the same warning. Can you please tell me what else can be the reason?Armure
Can you give us the full warning, and a bigger chunk of code? You can pastebin them here.Acetal
hi, I typecasted the 0 and 1 as long int, and it worked for me. Thanks for your helpArmure
Push(size, &ABC); is not a valid statement(ABC is a type, not a variable...)Freefloating
F
0

You are trying to cast an integer value (0 or 1) to a void pointer.

This expression is always an int with value 0 or 1: (GetCar(i) == term_Null()? 0 : 1)

And you try casting it to void pointer (POINTER) (typedef void * POINTER).

Which is illegal.

Freefloating answered 18/4, 2011 at 10:27 Comment(3)
This is exactly what I said.Acetal
@nightcracker - I agree with your answer, but I saw your post after I posted mine.Freefloating
MByD: Oh ok, I personally always click "Load new answers" :)Acetal
I
0

Since this question uses the same typedefs as your 32bit to 64bit porting question I assume that you're using 64 bit pointers. As MByd wrote you're casting an int to a pointer and since int isn't 64 bit you get that particular warning.

Inoue answered 18/4, 2011 at 10:31 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.