Re: (PR#9610) autosettler "territory" and danger maps
"Vasco Alexandre da Silva Costa" <[email protected]> Sun, 19 Dec 2004 19:04:48 -0800
| Newsgroups | gmane.games.freeciv.ai |
|---|---|
| Message-ID | <[email protected]> |
<URL: http://bugs.freeciv.org/Ticket/Display.html?id=9610 > On Sun, 19 Dec 2004, Jason Short wrote: > <URL: http://bugs.freeciv.org/Ticket/Display.html?id=9610 > > > You can't cast an int as a void* and treat it as a pointer. This won't work on 64-bit systems > where sizeof(int) != sizeof(void*). (Or so I'm told; I've never actually compiled on a 64-bit > system.) > > There are two choices (unless you want to redesign the movemap to hold unit pointers > directly and work properly with deletions). Probably the better one is to malloc(sizeof(int)) > and keep the unit ID in a malloced pointer. Naturally you then have to free the pointer > afterwards. The other is to develop our own version of G_POINTER_TO_INT/ > G_INT_TO_POINTER that could probably just be copied verbatim from the glib sources. > Naturally then we have to make sure this macro works on any new systems that turn up in > the future. C99 has integer types with sufficient size to hold pointers. These are intptr_t and uintptr_t (you will need to include <stdint.h>). On non-C99 systems, I used to hack around this either by using long (which works most of the time, but not on some weird systems) or ptrdiff_t. But the C99 way is clearly superior. Benoit is correct that you shouldn't find a system where sizeof(void *) is smaller than sizeof(int). Although this is not impossible, all the architectures I am aware of do not use such schemes. --- Vasco Alexandre da Silva Costa @ Instituto Superior Tecnico, Lisboa