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.