Otrzymanie Ostrzeżenia "cast to pointer from integer of different size" z poniższego kodu

Kod to:

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

Oto C code push zwraca ABC czyli

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

Jaki jest powód szczególnego Ostrzeżenia?

Author: thetna, 2011-04-18

4 answers

Możesz użyć intptr_t, aby upewnić się, że liczba całkowita ma taką samą szerokość jak wskaźnik. W ten sposób nie musisz odkrywać rzeczy dotyczących konkretnej platformy, a to będzie działać również na innej platformie(w przeciwieństwie do rozwiązania unsigned long).

#include <stdint.h>

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

Zaczerpnięte ze standardu C99:

7.18.1.4 typy całkowite zdolne do przechowywania wskaźników obiektów

1 The następujący typ oznacza znak Typ integer z właściwością, która każdy ważny wskaźnik do void może być przerobiony na ten wpisz, a następnie przekonwertuj powrót do pointer do void, a wynik będzie równy oryginalny wskaźnik:

Intptr_t

 21
Author: anatolyg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-18 13:06:32

Próbujesz oddać wartość całkowitą (0 LUB 1)do wskaźnika void.

To wyrażenie jest zawsze {[7] } int o wartości 0 LUB 1: (GetCar(i) == term_Null()? 0 : 1)

A ty spróbuj rzucić go do void pointer (POINTER) (typedef void * POINTER).

Co jest nielegalne.
 0
Author: MByD,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-18 10:27:47

Ponieważ to pytanie używa tych samych typedefs co twoje pytanie 32-bitowe na 64-bitowe, zakładam, że używasz 64-bitowych wskaźników. Jak napisał MByd, rzucasz int na wskaźnik, a ponieważ int nie jest 64 bitem, dostajesz to szczególne Ostrzeżenie.

 0
Author: Bob Prystanek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-18 10:31:16

Co próbujesz zrobić? wskaźniki nie są liczbami całkowitymi , a ty próbujesz utworzyć wskaźnik z 0 lub 1, w zależności od sytuacji. To nielegalne.


Jeśli próbujesz przekazać wskaźnik do ABC zawierającego 0 lub 1, Użyj tego:

ABC tmp = GetCar(i) == term_Null()? 0 : 1;
Push(size, &tmp);
 0
Author: orlp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-18 11:06:26