Динамический 2D массив теряет второе измерение - PullRequest
0 голосов
/ 08 мая 2011

У меня есть динамически размещенный двумерный массив, который заполняется парой циклов for.По какой-то причине к концу цикла for все элементы находятся в недоступной памяти.

/*************Start Positive Phase*************************/
double *posHidActivations = new double[FEATURES];
memset(posHidActivations, 0, sizeof(double)*FEATURES);

double *posVisActivations = new double[m_NumRatings];
memset(posVisActivations, 0, sizeof(double)*m_NumRatings);


double **posProducts = new double*[FEATURES];
for(int i=0; i<FEATURES; i++)
   posProducts[i] = new double[m_NumRatings];
for(int i=0; i<FEATURES; i++)
   for(int j=0; j<m_NumRatings; j++)
      posProducts[i][j] = 0;
/* manually verified elements are valid and 
   initialized to 0 with gdb */

// for each hidden node
for(int j=0; j<FEATURES; j++)
{   
   // sum up inputs from the visible layer
   for(int i=0; i<m_NumRatings; i++)
   {   
      double input = m_VisLayer[i]*m_Weights[i][j];
      double prob = sigmoid(input, m_HidItemBias[j]);
      posProducts[j][i] = m_VisLayer[i]*prob;
      posVisActivations[j]+=m_VisLayer[i];   // commenting out this line fixes
      posHidActivations[j]+=prob;
   }   
   // posProducts[i][0] is valid here
}  
/* posProducts[0][0] is a segfault 
   using gdp verified that posProducts is a valid double**
   and posProducts[0] is a valid double*

Объявления для идентификаторов, отсутствующих в предыдущем фрагменте:

int m_NumRatings;

m_VisLayer = new double[m_NumRatings];

m_Weights = new double* [m_NumRatings];
for(int i=0; i<m_NumRatings; i++)
   m_Weights[i] = new double [FEATURES];

m_HidItemBias = new double[FEATURES];

'FEATURES' is#defined константа

Редактировать: я забыл упомянуть.Позже в программе есть логически идентичный блок кода с использованием разных идентификаторов (posProducts -> negProducts, m_VisLayer -> m_HidLayer и т. Д.).Этот блок не показывает какие-либо из тех же симптомов.Я не могу найти никакой логической разницы, независимо от того, сколько раз я сравниваю код.

1 Ответ

4 голосов
/ 08 мая 2011

Как вы заметили:

posVisActivations[j]+=m_VisLayer[i];   // commenting out this line fixes

Индексом для posVisActivations является j, который варьируется от 0 до m_FEATURES, но posVisActivations объявляется как массив с элементами m_numRatings.

Итак,вы пишете за концом массива.Вы, вероятно, хотели использовать i в качестве индекса:

posVisActivations[i]+=m_VisLayer[i];   // commenting out this line fixes

HTH.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...