On Tue, 13 Jun 2006, Jimmy Huang wrote:
> > doing.
>
> I guess Hadley didn't know what he was doing when he
> wrote in the other 48 instances of printf ("%s \n",
> p_mapchars);

There aren't 48 other occurances, just 16.  There is no version history, so
they may not have been written by Hadley, but could have been by a neophyte
such as yourself.  But they are all bugs, anyone who knows C programming will
know exactly what is wrong as soon as they see the definition of p_mapchars.

> > I've fixed more bugs in Hadley's code that you have.
>
> Okay that's nice. As I personally don't program, I'm
> not really interested in fixing bugs. I want Hadley's
> bots to play better in a pickup style game.

You acted as if I had some some belief that Hadley's code could not have bugs.
Obviously I'm well aware that it is not perfect if I've been fixing bugs in
it.

> I tried this:
>
> #include <stdio.h>
>
> main()
> {
>    char mapchar[2];
>    memcpy (mapchar,"ab",2);
>    printf ("%s \n",&mapchar);
> }
>
> As is turns out, Trent is right, and gcc isn't too
> smart.

It has nothing to do with the compiler.  It is doing exactly what it is
supposed to do.

> But, if you stuck a strncpy instead of memcopy. gcc
> will stick a \0 right at the end, even though there's
> no way it should have been allowed to do it.

C doesn't do range checking on arrays.  If you call strncpy and tell it to
overwrite the end of an array, which is what you are doing, then it will.  Try
compiling this _without_ optimization:

main()
{
    int y;
    char x[2];
    y = 0x12345678;
    strncpy(x, "ab", 3);
    printf("x = %s y = %x\n", x, y);
}

> In fact, I don't have a c manual anywhere.

There are lots on the web.

>
> I assume the correct way would be:
>
> printf ("%c%c \n",mapchar[0],mapchar[1]);

It would be better to do what is done in the server code, and just null
terminate p_mapchars so that it's less cumbersome to print out.