Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: bugs, Bugs and BUGS!

Author: Richard Pijl

Date: 04:02:25 05/28/04

Go up one level in this thread


On May 28, 2004 at 05:44:34, Uri Blass wrote:

>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.

That was not my point
The point is that the compiler cannot know what happens inside move_str (as it
is probably in another module). I showed that it is possible to change move_str
to get the desired functionality with a single printf statement.
In general, when using a function that returns a string, _always_ determine:
- If the allocation of the memory is static or dynamic.
- If static:
    - who owns the memory of the string. Is it owned by the called function,
      global, or provided (by a parameter) by the calling function.
    - Can the function be called multiple times before using the string
- If dynamic: who 'free()'s the memory again.

Richard.

>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.