On Tue, 2 May 2000, Patrick Dughi wrote:
> Yep - the biggest problem though is that you can't access and
> throw it around like you can an array.
Technically, you can: it _is_ an array as far as C is concerned. I don't
see anything, then, you can do with a statically sized array you can't do
here. Nor anything you can do with a statically sized multi-dimensional
array that you can't do here with as much ease. The macro use is a bit
heavy and might not be the most superb idea, but it's not difficult to
understand or follow for newbies (AFAICT).
> I always think it's better though to put off that huge amount of work
> with multiple macros which to use eventually requires a decent amount
> of understanding about how the system is setup.
Huge amount of work? The additional work amounts to:
/* Changed to use m->rooms, so we can have variable-sized layers. */
CREATE(m, struct map_data, Z);
CREATE(m->rooms, struct room_data, X*Y);
#define COORD(m, x, y) (((m)->sizeX * (y)) + (x))
#define MAP(m, x, y, z) ((m)[z].rooms[COORD(m, x, y)])
Beyond that, I think it masks use of the map space quite well. Code I
write that does:
int laddr, z, max = (m->sizeX * m->sizeY);
for (z = 0; z < m->sizeZ; z++)
for (laddr = 0; laddr < max; laddr++)
/* access m[z].rooms[laddr] */
which takes for granted the linear allocation of the memory can just as
easily be written as,
int x, y, z;
for (x = 0; x < m->sizeX; x++)
for (y = 0; y < m->sizeY; y++)
for (z = 0; z < m->sizeZ; z++)
/* do something to MAP(m, x, y, z) */
which might be what a newbie is inclined to do. Of course, this last is
slower than the similar construct with an actual multi-dimensional array
because you don't have to fudge x, y, z to get the unique linear
address. That's probably not a big deal unless you're doing it a _lot_,
and if you are, then the linear address method will probably be faster
than both, anyway.
I don't see any other cases where you'll have to exploit or understand the
actual nature of m->rooms. The only thing you need to know is precisely
what you would need to know with an actual multi-dimensional array: the
access MAP(m, x, y, z) returns a single point on the map ("room"). This
is not unlike understanding that world[X] returns a single room in the
world, or array[x][y][z] returns a single point on the map. But it is
ultimately more flexible, and, I believe, not subject to any significant
increase in code complexity or effort.
Correct me if I'm out of my head, of course.
-dak
+------------------------------------------------------------+
| Ensure that you have read the CircleMUD Mailing List FAQ: |
| http://qsilver.queensu.ca/~fletchra/Circle/list-faq.html |
+------------------------------------------------------------+
This archive was generated by hypermail 2b30 : 04/10/01 PDT