|
From: Darkriser on 18 May 2008 12:56 Desperately asking for help... I'm working on a DLL. The main code parts are following: (I'm trying to include only IMPORTANT lines) // basic custom datatype struct gideElement { float (**eleFunc)(unsigned int, gideElement**); // pointer to pointer to function float (*eleFuncActual)(unsigned int, gideElement**); // pointer to function } // custom functions float f01 (unsigned int argCnt, gideElement **funcArgs) {} float f02 (unsigned int argCnt, gideElement **funcArgs) {} // static enumerator for functions typedef float (*MyFunc)(unsigned int, gideElement**); const MyFunc allFuncs[] = { NULL, &f01, &f02}; // allocate memory for array of objects arrGide = (gideElement*) malloc(sizeof (gideElement) * modelSize); // modelSize is "int" // assign properties (arrGide + i)->eleFuncActual = allFuncs[ f_code_actual ] // f_code_actual is function's index retrieved from DB (arrGide + i)->eleFunc = &((arrGide + i)->eleFuncActual); // eleFunc will point to eleFuncActual And now the problem. Once I compile the DLL without Whole Program Optimization, link with Link Time Code Generation set to Default and Enable Incremental Linking set to YES, the DLL works great. However, once I set Release options (/GL for compiler and /ltcg /INCREMENTAL:NO for linker), the following condition evaluates to TRUE even if it's not!!!: if ( *((arrGide + curIdx)->eleFunc) == allFuncs[53] ) { // do some stuff only if we have eleFuncActual pointer pointing to function having index 53 } In Debugger everything works fine. This issue happens only with Release configuration during Run-time. Thanks many times....
From: Tim Roberts on 19 May 2008 23:40 Darkriser <Darkriser(a)discussions.microsoft.com> wrote: > >Desperately asking for help... >I'm working on a DLL. The main code parts are following: >(I'm trying to include only IMPORTANT lines) >... >// assign properties >(arrGide + i)->eleFuncActual = allFuncs[ f_code_actual ] // f_code_actual is >function's index retrieved from DB >(arrGide + i)->eleFunc = &((arrGide + i)->eleFuncActual); // eleFunc will >point to eleFuncActual Why would you write your expressions in that confusing manner, instead of the more clear and ordinary way: arrGide[i].eleFuncActual = allFuncs[ f_code_actual ]; arrGide[i].elefunc = &arrGide[i].eleFuncActual; >And now the problem. Once I compile the DLL without Whole Program >Optimization, link with Link Time Code Generation set to Default and Enable >Incremental Linking set to YES, the DLL works great. > >However, once I set Release options (/GL for compiler and /ltcg >/INCREMENTAL:NO for linker), the following condition evaluates to TRUE even >if it's not!!!: > >if ( *((arrGide + curIdx)->eleFunc) == allFuncs[53] ) >{ > // do some stuff only if we have eleFuncActual pointer pointing to >function having index 53 >} > >In Debugger everything works fine. This issue happens only with Release >configuration during Run-time. In that case, I guess you need to release your DLL without full optimization. The optimizer is the most complicated part of the compiler, which means it is where rarely-triggered bugs often lurk. Is this a multi-threaded program? Is it possible you have a timing issue? -- Tim Roberts, timr(a)probo.com Providenza & Boekelheide, Inc.
|
Pages: 1 Prev: string class and UNICODE? Next: PostThreadMessage Failure |