Author: Uri Blass
Date: 14:48:33 02/22/03
Go up one level in this thread
On February 22, 2003 at 17:39:55, Dezhi Zhao wrote: >On February 22, 2003 at 17:24:26, Uri Blass wrote: > >>On February 22, 2003 at 17:14:35, Dezhi Zhao wrote: >> >>>On February 22, 2003 at 16:00:00, Uri Blass wrote: >>> >>>>On February 22, 2003 at 15:28:06, Dezhi Zhao wrote: >>>> >>>>>On February 22, 2003 at 02:54:40, Uri Blass wrote: >>>>> >>>>>>On February 21, 2003 at 15:59:25, Dezhi Zhao wrote: >>>>>> >>>>>>>On February 21, 2003 at 13:31:50, Uri Blass wrote: >>>>>>> >>>>>>>>On February 21, 2003 at 13:10:27, Dezhi Zhao wrote: >>>>>>>> >>>>>>>>>On February 21, 2003 at 12:48:45, Uri Blass wrote: >>>>>>>>> >>>>>>>>>>On February 21, 2003 at 11:15:24, Dezhi Zhao wrote: >>>>>>>>>> >>>>>>>>>>>On February 21, 2003 at 04:14:49, Uri Blass wrote: >>>>>>>>>>> >>>>>>>>>>>>On February 20, 2003 at 13:51:37, Filip Tvrzsky wrote: >>>>>>>>>>>> >>>>>>>>>>>>>On February 20, 2003 at 12:49:39, Uri Blass wrote: >>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>>I guess that you mean >>>>>>>>>>>>>>#define gen_dat_i_mpromote (gen_dat[i].m & (63 << 16)) >>>>>>>>>>>>>> >>>>>>>>>>>>>>I guess that the laternative that I tried >>>>>>>>>>>>>> >>>>>>>>>>>>>>#define to(x) (((x)>>8)&255) was also bad >>>>>>>>>>>>>>and better was >>>>>>>>>>>>>>#define to(x) (((x)&255<<8) >>>>>>>>>>>>>> >>>>>>>>>>>>>>I guess that in that case I need to change some more code >>>>>>>>>>>>>> >>>>>>>>>>>>>>For example >>>>>>>>>>>>>> >>>>>>>>>>>>>>I have today some cases when I have >>>>>>>>>>>>>>switch(m.bits) >>>>>>>>>>>>>>case 1: >>>>>>>>>>>>>>case 17: >>>>>>>>>>>>>>... >>>>>>>>>>>>>> >>>>>>>>>>>>>>in that case I need to say case 1<<24 and in order not to have an ugly code >>>>>>>>>>>>>>I need to have more constants for 2^24,2^24*17,... >>>>>>>>>>>>>> >>>>>>>>>>>>>>I can use >>>>>>>>>>>>>>enum >>>>>>>>>>>>>>{ >>>>>>>>>>>>>> bits1=16777216 >>>>>>>>>>>>>> bits17= >>>>>>>>>>>>>>... >>>>>>>>>>>>>>} >>>>>>>>>>>>>> >>>>>>>>>>>>>>Uri >>>>>>>>>>>>> >>>>>>>>>>>>>#define to(x) (((x)>>8)&255) is definitely worse than #define to(x) >>>>>>>>>>>>>(((x)&255<<8) because in the first case the shifting is done in run-time and in >>>>>>>>>>>>>the second during compilation. Note also that the result of both macros is >>>>>>>>>>>>>different. >>>>>>>>>>>> >>>>>>>>>>>>Yes >>>>>>>>>>>> >>>>>>>>>>>>This is an important note. >>>>>>>>>>>> >>>>>>>>>>>>I did not do the mistake of assuming that they are the same but I see that I >>>>>>>>>>>>have problems. >>>>>>>>>>>> >>>>>>>>>>>>I cannot use my usual macros after that translate >>>>>>>>>>>> >>>>>>>>>>>>for example >>>>>>>>>>>> >>>>>>>>>>>>I had if (piece(m.b.to))=PAWN) in my code >>>>>>>>>>>>I cannot transalate it to >>>>>>>>>>>>if (piece(to(m))==PAWN) because to(m) does not get something between 0 and 63 >>>>>>>>>>>>after the change and it seem that I cannot do it faster in this case. >>>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>>you probabaly need another inline function or micro here: >>>>>>>>>>> >>>>>>>>>>>#define IsPawn(move) (piece(move.b.to) == PAWN) >>>>>>>>>> >>>>>>>>>>note that piece() is not a function and it is in my defines >>>>>>>>>> >>>>>>>>>>#define piece(square) ((info[square])&7) >>>>>>>>>> >>>>>>>>>>The point is that info[64] include for every square both the color and both the >>>>>>>>>>piece and the piece can be accesed by the array info[64] that is an array of >>>>>>>>>>int. >>>>>>>>>> >>>>>>>>> >>>>>>>>>nested macroes are OK. >>>>>>>>> >>>>>>>>>>> >>>>>>>>>>>If you are using VC, inline functions are prefered. You can easily browse these >>>>>>>>>>>inline fuctions. And the compiler does type checking that is certainly helpful. >>>>>>>>>> >>>>>>>>>>I do not see a function that I should inline in that case because there is no >>>>>>>>>>function in the code that I posted(only macros). >>>>>>>>>> >>>>>>>>> >>>>>>>>>You missed the point that a inline function is the same in effect as a macro. >>>>>>>>>A inline function _is_ a much better macro. >>>>>>>> >>>>>>>>Thanks for the advice. >>>>>>>>I use visual C++ but >>>>>>>>I saved the files in my project as .c >>>>>>>>I guess that inline functions mean that I need to change the .c to .cpp first >>>>>>> >>>>>>>yes. a simple rename >>>>>> >>>>>>It is not so simple because I get errors from doing it >>>>>> >>>>>>hash_table = calloc(TableSize, sizeof( HASHE )); >>>>>> >>>>>>: error C2440: '=' : cannot convert from 'void *' to 'struct tagHASHE *' >>>>>> Conversion from 'void*' to pointer to non-'void' requires an explicit >>>>>>cast >>>>>>evaluate.cpp >>>>>> >>>>>>I get also warnings that I did not get in C >>>>>> >>>>>>warning C4390: ';' : empty controlled statement found; is this the intent? >>>>>> >>>>>>My reply Yes it is >>>>>>I ignore opponent time but I may use it in the future so I told my program to do >>>>>>nothing when it gets the opponent time from winboard. >>>>>> >>>>>>warning C4551: function call missing argument list >>>>>> >>>>>>At least I could fix that warning by changing >>>>>> >>>>>>input_available >>>>>>to >>>>>>input_available() >>>>>> >>>>>>Strange that I did not get the same warning in C. >>>>>> >>>>>>Uri >>>>> >>>>>These added warnings are good things in fact. C++ has some more tight type >>>>>checking. So you may consider changing those generating warnings, like this: >>>>> >>>>>hash_table = (tagHASHE*) calloc(TableSize, sizeof(HASHE)); >>>>> >>>>>or the C style: >>>>> >>>>>hash_table = (struct tagHASHE *) calloc(TableSize, sizeof(HASHE)); >>>>> >>>>>dzhao >>>> >>>>Thanks but I still have problems. >>>> >>>>I tried in my C files(I renamed them back to C) and got the following warnings >>>> >>>>warning C4047: 'function' : 'unsigned int ' differs in levels of indirection >>>>from 'struct tagHASHE *' >>> >>>this warning must come from somewhere else. you can double-click at the warning >>>to see which line it is complainng about. >> >>I cannot double click on the warning but the line is exactly line 370 >>and here is the content of that line: >> >>hash_table = calloc((struct tagHASHE *) TableSize, sizeof( HASHE )); >> >> > >why you cast it to tagHASHE * ?! > >try this: >hash_table = (HASHE*) calloc(TableSize, sizeof(HASHE)); Does not help same warnings: warning C4047: 'function' : 'unsigned int ' differs in levels of indirection from 'struct tagHASHE *' warning C4024: 'calloc' : different types for formal and actual parameter 1 > >>> >>>>warning C4024: 'calloc' : different types for formal and actual parameter 1 >>>> >>>> >>>>Note that TableSize is an integer and here is the relvant defintion in my >>>>program. >>> >>>parameter 1 of calloc is an unsigned. so you may define TableSize as unsigned. >> >>only helps to get another warning for line 366 that is posted here >> >>while (TableSize>=(1<<i)) >> >>main.c(366) : warning C4018: '>=' : signed/unsigned mismatch > >this is normal for type checking. the compiler helps to identify the potential >failures. so, you end up with this, to make it clear: > >while (TableSize >= (unsigned) 1 << i) This helped but the first 2 warning are still there. The unsigned warning seems to do nothing with TableSize. 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.