Author: Richard Pijl
Date: 02:04:41 05/28/04
Go up one level in this thread
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.
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.