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.