Получение приведения предупреждения к указателю из целого числа разного размера из следующего кода

Код:

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

Вот C code push возвращает ABC, который

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

В чем причина конкретного предупреждения?


person thetna    schedule 18.04.2011    source источник
comment
sizeof(int)==sizeof(void*) на вашей платформе?   -  person Mat    schedule 18.04.2011
comment
размер int и размер указателя void ** не отличаются. Поэтому я использую **long int.   -  person thetna    schedule 18.04.2011
comment
так что вы не понимаете в сообщении? вы приводите int к типу указателя, вы знаете, что они имеют разные размеры, и сообщение говорит вам об этом снова. кажется довольно ясным, не так ли?   -  person Mat    schedule 18.04.2011


Ответы (4)


Вы можете использовать intptr_t, чтобы гарантировать, что целое число имеет ту же ширину, что и указатель. Таким образом, вам не нужно узнавать информацию о вашей конкретной платформе, и она будет работать и на другой платформе (в отличие от решения unsigned long).

#include <stdint.h>

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

Взято из стандарта C99:

7.18.1.4 Целочисленные типы, способные хранить указатели на объекты

1 Следующий тип обозначает целочисленный тип со знаком, обладающий тем свойством, что любой допустимый указатель на void может быть преобразован в этот тип, а затем преобразован обратно в указатель на void, и результат будет равен исходному указателю:

intptr_t

person anatolyg    schedule 18.04.2011

Вы пытаетесь привести целочисленное значение (0 или 1) к пустому указателю.

Это выражение всегда является целым числом со значением 0 или 1: (GetCar(i) == term_Null()? 0 : 1)

И вы пытаетесь привести его к пустому указателю (POINTER) (typedef void * POINTER).

Что незаконно.

person MByD    schedule 18.04.2011
comment
Это точно то, что я сказал. - person orlp; 18.04.2011
comment
@nightcracker - я согласен с вашим ответом, но я увидел ваш пост после того, как опубликовал свой. - person MByD; 18.04.2011
comment
MByD: О, хорошо, лично я всегда нажимаю Загрузить новые ответы :) - person orlp; 18.04.2011

Поскольку в этом вопросе используются те же определения типов, что и в вашем вопросе о переносе с 32-битной на 64-битную версию, я предполагаю, что вы используете 64-битные указатели. Как писал MByd, вы приводите int к указателю, и, поскольку int не является 64-битным, вы получаете это конкретное предупреждение.

person Bob Prystanek    schedule 18.04.2011

Что ты пытаешься сделать? Указатели не являются целыми числами, и вы пытаетесь сделать указатель из 0 или 1, в зависимости от ситуации. Это незаконно.


Если вы пытались передать указатель на ABC, содержащий 0 или 1, используйте это:

ABC tmp = GetCar(i) == term_Null()? 0 : 1;
Push(size, &tmp);
person orlp    schedule 18.04.2011
comment
я сделал тот, который вы упомянули здесь. но все же я получаю то же предупреждение. Подскажите пожалуйста, в чем еще может быть причина? - person thetna; 18.04.2011
comment
Можете ли вы дать нам полное предупреждение и больший кусок кода? Вы можете вставить их здесь. - person orlp; 18.04.2011
comment
привет, я присвоил 0 и 1 значение long int, и у меня это сработало. Спасибо за вашу помощь - person thetna; 18.04.2011
comment
Push(size, &ABC); недопустимый оператор (ABC - это тип, а не переменная...) - person MByD; 18.04.2011