Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: bugs, Bugs and BUGS!

Author: Uri Blass

Date: 02:44:34 05/28/04

Go up one level in this thread


On May 28, 2004 at 05:04:41, Richard Pijl wrote:

>On May 27, 2004 at 18:10:47, Uri Blass wrote:
>
>>On May 27, 2004 at 17:48:00, Richard Pijl wrote:
>>
>>>
>>>>>>>>
>>>>>>>>1)I asked the computer to print the moves in the book only to discover that
>>>>>>>>printf("%s %s",move1,move2) does not work.
>>>>>>>
>>>>>>>Are move1 and move2 char* 's?  If so, that should be fine.
>>>>>>>What's happening?
>>>>>>>
>>>>>>>
>>>>>>>--
>>>>>>>James
>>>>>>
>>>>>>I do not know but for me it did not work and the computer printed the first
>>>>>>string twice instead of printing 2 different strings.
>>>>>>
>>>>>>Try the following code that is part of movei:
>>>>>>
>>>>>>
>>>>>>#define rankfrom(u) (((u)>>3)&7)
>>>>>>#define rankto(u)  (((u)>>9)&7)
>>>>>>#define filefrom(u) ((u)&7)
>>>>>>#define fileto(u) (((u)>>6)&7)
>>>>>>#define promotion(u) ((u)&(1<<29))
>>>>>>#define promote(u) (((u)>>16)&255)
>>>>>>
>>>>>>char *move_str(int move)
>>>>>>{
>>>>>>	static char str[6];
>>>>>>
>>>>>>	char c;
>>>>>>
>>>>>>	if (promotion(move)) {
>>>>>>		switch (promote(move)) {
>>>>>>			case KNIGHT:
>>>>>>				c = 'n';
>>>>>>				break;
>>>>>>			case BISHOP:
>>>>>>				c = 'b';
>>>>>>				break;
>>>>>>			case ROOK:
>>>>>>				c = 'r';
>>>>>>				break;
>>>>>>			default:
>>>>>>				c = 'q';
>>>>>>				break;
>>>>>>		}
>>>>>>		sprintf(str, "%c%d%c%d%c",
>>>>>>				filefrom(move) + 'a',
>>>>>>				rankfrom(move)+1,
>>>>>>				fileto(move) + 'a',
>>>>>>				rankto(move)+1,
>>>>>>				c);
>>>>>>	}
>>>>>>	else
>>>>>>	{
>>>>>>		sprintf(str, "%c%d%c%d",
>>>>>>				filefrom(move) + 'a',
>>>>>>				rankfrom(move)+1,
>>>>>>				fileto(move) + 'a',
>>>>>>				rankto(move)+1);
>>>>>>	}
>>>>>>	return str;
>>>>>>}
>>>>>>
>>>>>>printf("%s %s",move_str(1),move_str(0));
>>>>>>
>>>>>>//result b1a1 b1a1
>>>>>>
>>>>>>printf("%s %s",move_str(0),move_str(1));
>>>>>>
>>>>>>//result a1a1 a1a1
>>>>>>
>>>>>>Uri
>>>>>
>>>>>This is an easy one: your strings share one common place in memory, namely the
>>>>>variable static char str[6]. Therefore when you call move_str() for the second
>>>>>time, the first string gets overwrited.
>>>>>Filip
>>>>
>>>>I do not understand why they share one place in memory.
>>>>
>>>>The computer is supposed to do the following:
>>>>
>>>>1)calculate move_str(0)
>>>>2)forget every local varaible including str[6]
>>>
>>>This one is a local 'static' variable. It keeps its value.
>>>
>>>>3)calculate move_str(1)
>>>
>>>This will overwrite str.
>>>
>>>>4)forget every local varaible.
>>>>
>>>
>>>remember that an array variable is equivalent to a pointer in C. You're
>>>returning a pointer to the array str, not the string itself.
>>>
>>>return str;
>>>
>>>is equivalent with
>>>
>>>return &str[0];
>>>
>>>>Note that it seems to do it in that way when I do it in 2 different printf for 2
>>>>strings but not when I use one printf.
>>>
>>>First both functions are called, and then the string is built by printf, so you
>>>will get the same move twice.
>>>
>>>Richard.
>>
>>I do not get the same move twice when I have
>>printf("%s ",move_str(0));
>>printf("%s ",move_str(1));
>>
>>I thought that
>>printf("%s %s ",move_str(0),move_str(1));
>>should be exactly the same instruction.
>>
>>I understand now that it is not and the second printf does not print move_str(1)
>>immediatly after it calculates it but calculates also move_str(0) and change the
>>value of move_str(1) by doing it.
>>
>>I think that it is a bug in the language or in the compiler because it is clear
>>that the programmer mean the same in both cases.
>>
>>
>>correct compiler can solve the problem by translating
>>
>>printf("%s %s ",move_str(0),move_str(1));
>>to
>>printf("%s ",move_str(0));
>>printf("%s ",move_str(1));
>>
>>I see no logical reason not to translate it in that way from human point of
>>view.
>>
>>
>>
>>Uri
>
>If you insist, apply some changes to move_str:
>
>static char strbuf[4][6]; // making 4 parallel calls to move_str possible
>static int strindex=0;
>char*str;
>
>// on entering the function:
>strindex=(strindex+1)&3; // use the next string index
>                         // equivalent to:
>                         // strindex++;
>                         // if (strindex>=4) strindex=0;
>str=strbuf[strindex];
>
>With this adaptations the function does what you want.
>Are you convinced now that this is not a compiler error?
>Note that the compiler does not know the internals of move_str().
>
>Richard.


I do not think that I need to change move_str
The function practically does what I want.

The problem is only that printf does not do what I want so maybe it is better if
I write a function instead of printf to do what I want but I think that I will
simply use seperate printf for sperate strings so there is going to be no
problem.

Uri




This page took 0 seconds to execute

Last modified: Thu, 15 Apr 21 08:11:13 -0700

Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.