Проблема локальной переменной во вложенном цикле 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;
}

0 ответов

Другие вопросы по тегам