Author: Dezhi Zhao
Date: 14:58:39 02/22/03
Go up one level in this thread
On February 22, 2003 at 17:48:33, Uri Blass wrote: >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 *' are you sure this is the line you get the warning? what is your hash_table declaration? > warning C4024: 'calloc' : different types for formal and actual parameter 1 > or define TableSize as size_t to see what happens. > >> >>>> >>>>>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.