Complete.Org: Mailing Lists: Archives: freeciv-dev: August 2004:
[Freeciv-Dev] (PR#9869) Bug: DDEBUG changes savegames

[Freeciv-Dev] (PR#9869) Bug: DDEBUG changes savegames

[Top] [All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index] [Thread Index]
To: undisclosed-recipients: ;
Subject: [Freeciv-Dev] (PR#9869) Bug: DDEBUG changes savegames
From: "Gregory Berkolaiko" <Gregory.Berkolaiko@xxxxxxxxxxxxx>
Date: Sun, 29 Aug 2004 21:19:36 -0700
Reply-to: rt@xxxxxxxxxxx

<URL: >

On Sun, 29 Aug 2004, Gregory Berkolaiko wrote:

> Savegames when compiled with --enable-debug are really different from the
> very beginning.

Traced first divergence to:
    index_to_map_pos(x, y, myrand(map.xsize * map.ysize));
in rand_map_pos_filtered in map.c

index_to_map_pos evaluates its argument many times:

#define index_to_map_pos(pmap_x, pmap_y, index) \
  (CHECK_INDEX(index),                          \
   index_to_native_pos(pmap_x, pmap_y, index),  \
   native_to_map_pos(pmap_x, pmap_y, *(pmap_x), *(pmap_y)))

#ifdef DEBUG
#define CHECK_MAP_POS(x,y) assert(is_normal_map_pos((x),(y)))
#define CHECK_INDEX(index) assert((index) >= 0 && (index) < MAX_MAP_INDEX)
#define CHECK_MAP_POS(x,y) ((void)0)
#define CHECK_INDEX(index) ((void)0)

#define index_to_native_pos(pnat_x, pnat_y, index)                  \
  (*(pnat_x) = (index) % map.xsize,                                 \
   *(pnat_y) = (index) / map.xsize)

So, even when CHECK_INDEX is not defined, "index" is evaluated twice.

I am not sure which is the better way to fix this: do temporary
assignments inside index_to* functions or do it in the caller.  The first
way might give more work to compiler (optimizing), the second will give
more work to us (reviewing all uses).


[Prev in Thread] Current Thread [Next in Thread]