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.