Проблема локальной переменной во вложенном цикле while
У меня возникают проблемы с сохранением значения локальной переменной во вложенном цикле while при тестировании кода C на компьютере с архитектурой X86. Ниже приведен пример кода.
method()
int count=5,i = 0,j=0;
while (condition1)
{
// some C logic
while (condition2)
{
// some C logic
count ++;
} // end of inner while loop
} //end of outer while
// some logic
}// end of method
В приведенном выше коде всякий раз, когда программный элемент управления входит во внутренний цикл while, значение счетчика сбрасывается в 0, впервые, когда элемент управления достигает внутреннего значения, а значение цикла сбрасывается в 0, затем оно увеличивается на +1. Затем, когда он снова возвращается к внутреннему параметру while, он снова обнуляется, и я не могу понять, в чем проблема. Мы переходим на архитектуру X86 от SPARC и никогда не сталкивались с такой странной проблемой в SPARC.
ПРИМЕЧАНИЕ: если я переместу переменную counter таким образом, то код будет вести себя нормально
int i = 0,j=0;
int count =0;
Это из-за компилятора GCC или неправильно установлены некоторые флаги в GCC, ниже приведены настройки GCC
configured with: ../gcc-4.1.1/configure --prefix=/export/home/user1/TEST --enable-languages=c --with-as=/export/home/user1/TEST/bin/as --with-gnu-as --with-nm=/export/home/user1/TEST/bin/nm --with-gnu-nm --with-ld=/export/home/user1/TEST/bin/ld --with-gnu-ld : (reconfigured) ../gcc-4.1.1/configure --prefix=/export/home/user1/TEST --with-as=/usr/sfw/bin/gas --with-gnu-as --with-ld=/usr/ccs/bin/ld --without-gnu-ld --enable-languages=c --enable-shared
Thread model: posix
gcc version 4.1.1
ниже приведено полное определение метода -
char **
#if NeedFunctionPrototypes
get_xref_entries (DBPROCESS *dbproc, int trans_Id, char action, int sz, int *xref_count)
#else
get_xref_entries (dbproc, trd_num, action, sz, xref_count)
DBPROCESS *dbproc;
char *tba_trd_num;
char action;
int sz;
int *xref_count;
#endif
{
FUNCNAME("get_trade_xref.c:get_xref_entries()");
STARTFUNC;
int count = 0,i=0,j;
RETCODE rc = RC_OK;
char ** xref_num;
char num[16];
char trans_id[16];
sprintf (trans_id, "%d", trans_Id);
dbfcmd (dbproc, "select distinct trd_num from %s..trades_xref ", get_mbs_db_name());
dbfcmd (dbproc, "where xref_num = '%s' ", trans_id );
if (action != '0')
dbfcmd (dbproc, "and action = '%c' ", action);
if (dbsqlexec(dbproc) == FAIL)
{
log_printf( "Error: sqlexec error\n" );
log_alert("%s: sqlexec error", fcn);
rc = RC_NOK;
}
if (rc == RC_OK)
{
while ((rc = dbresults(dbproc)) != NO_MORE_RESULTS)
{
if (rc == SUCCEED)
{
dbbind(dbproc, 1, NTBSTRINGBIND, 0, (BYTE *)num);
}
while (dbnextrow(dbproc) != NO_MORE_ROWS)
{
char **tmp;
if (count == 0)
{
xref_num = (char**)calloc(sz, sizeof(char*));
if (xref_num == NULL)
{
log_printf( "ERROR: Cannot allocate memory. \n");
log_alert("%s: Cannot allocate memory.", fcn);
dbcancel (dbproc);
}
for (j=count;j<sz;xref_num[j] = (char*)calloc(12, sizeof(char)), j++);
}
else if (count >= sz)
{
sz += count;
tmp = (char**)realloc(xref_num, sz * sizeof(char*));
if (tmp == NULL)
{
log_printf( "ERROR: Cannot allocate memory. \n");
log_alert("%s: Cannot allocate memory.", fcn);
dbcancel (dbproc);
}
for (j=count;j<sz;tmp[j] = (char*)calloc(12, sizeof(char)), j++);
for (j=0; j < count; strcpy(tmp[j], xref_num[j]), j++);
xref_num = tmp;
}
strcpy(xref_num[count], num);
count++;
}
}
}
*xref_count = count;
/*return (count > 0 ? xref_num : NULL); */
if (count > 0)
return xref_num;
return NULL;
}