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?
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
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
).
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.
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);
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