Author: Robert Hyatt
Date: 08:36:50 01/01/03
Go up one level in this thread
On January 01, 2003 at 08:33:19, Uri Blass wrote: >On January 01, 2003 at 07:04:29, Dave Gomboc wrote: > >>>>>This was only thinking about a theoretical case but I found other things in my >>>>>code. >>>>> >>>>>In a lot of places in my program >>>>>I have a condition like >>>>> >>>>>while (target!=-1&&info[target]==EMPTY) >>>>> >>>>>In most cases target!=-1 >>>>> >>>>>I thought that I need to do the && in this order >>>>>Do you say that I can change the order without risks? >>>>> >>>>>Suppose that the loop stops in most of the cases because of the fact that >>>>>info[target]=EMPTY. >>>>> >>>>>Does it going to do my program faster or maybe the compiler can detect these >>>>>cases in profile optimazions? >>>>> >>>>>I thought that even checking the value of info[-1] can give an error or change >>>>>some varaible that I do not want. >>>>> >>>>>Uri >>>> >>>>Technically, checking the value of info[-1] could even cause your program to >>>>crash. But in practice, as long as your program has the ability to access the >>>>memory immediately in front of info, it will probably just read the value in >>>>that memory location. >>>> >>>>To be slightly safer, you can declare a padded_info like I suggested elsewhere >>>>in this thread. That way even assignments to info[-1] won't cause a problem -- >>>>on most architectures, with most compilers. >>>> >>>>>while (target!=-1&&info[target]==EMPTY) >>>> >>>>Technically it would be wrong to flip this test around, but in practice you can >>>>probably get away with it. >>>> >>>>Dave >>> >>>originally info is a global array and >>>I have int info[64]; >>> >>>If I understand correctly >>>Based on your example I can use in data.c >>> >>>int PADDED_info[65]; >>>int * const info = PADDED_info+1; >> >>Yes. > >Does not work for me > > >I deleted from data.c >int info[64]; >I deleted from data.h >extern info[64]; > >I added to data.h >extern int PADDED_info[65]; >extern int * const info = PADDED_info+1; > >I added to data.c > >int PADDED_info[65]; >int * const info = PADDED_info+1; You went too far. In data.h, add one line: extern int * const info; In data.c, add two lines: int PADDED_info[65]; int * const info = PADDED_info+1; You should be set... You are defining info everywhere you include data.h, which is wrong. You can only initialize stuff once, which is what you should use data.c for. data.h should only contain references to things you need in each module, and since you _never_ access PADDED_info directly, leave it out. And since you have initialized info in data.c, that is the only place you should initialize it. data.h should simply reference it by name so you can use it in each module. > > >This is what I got as a result(I still do not use the intel compiler). > >data.obj : error LNK2005: _info already defined in boardi.obj >evaluate.obj : error LNK2005: _info already defined in boardi.obj >main.obj : error LNK2005: _info already defined in boardi.obj >Release/main.exe : fatal error LNK1169: one or more multiply defined symbols >found >Error executing xilink6.exe. > >main.exe - 4 error(s), 0 warning(s) > >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.