2013-04-17 2 views
0

Пожалуйста, посмотрите на мой код ниже:Функция, возвращающая указатель на указатель

class SVMClassifier : public LibHAR 
{ 
public: 
    ... 
    //This is my function returning a pointer to pointer to svm_node structure 
    svm_node** SVMFeatureExtraction(SkeData* inputData, int* pFrameNum, int* pFeatureNum, double wt); 

    //This function calls SVMFeatureExtraction 
    virtual bool FeatureExtraction(SkeData* inputData, const double* dataLabels = NULL, int labelNum = 0); //This function calls SVMFeatureExtraction 
    ... 
private: 
svm_node** SVMNodes; 
int dataNum; 
... 
} 

svm_node** SVMClassifier::SVMFeatureExtraction(SkeData* inputData, int* pFrameNum, int* pFeatureNum, double wt) 
{ 
    *pFeatureNum = FEATURENUM; 
    *pFrameNum = inputData->GetFrameSaved(); 
    svm_node** pNodes = new svm_node*[*pFrameNum]; 

    for (int i = 0; i < *pFrameNum; i++) 
    { 
     pNodes[i] = new svm_node[FEATURENUM + 1]; 
     for (int j = 0; j < FEATURENUM/3; j++) 
     { 
      FEATURE_VEC* pVec = new FEATURE_VEC; 
      if (!CalFeatureVector(inputData, i+1, j+1, pVec, wt)) 
       return NULL; 

      pNodes[i][j*3].index = j*3 + 1; 
      pNodes[i][j*3].value = pVec->x; 

      pNodes[i][j*3 + 1].index = j*3 + 2; 
      pNodes[i][j*3 + 1].value = pVec->y; 

      pNodes[i][j*3 + 2].index = j*3 + 3; 
      pNodes[i][j*3 + 2].value = pVec->z; 

      delete pVec; 
     } 
     pNodes[i][FEATURENUM].index = -1; 
     pNodes[i][FEATURENUM].value = 0; 

    } 
    return pNodes; 
} 

bool SVMClassifier::FeatureExtraction(SkeData* inputData, const double* dataLabels, int labelNum) 
{ 

    CleanNodes(); 
    int n; 
    SVMNodes = SVMFeatureExtraction(inputData, &dataNum, &n, actWeight); //Error here! 
     ... 
} 

Метод класса FeatureExtraction вызывает другой метод SVMFeatureExtraction который возвращает указатель на указатель. Я думаю, что память, указанная указателем, динамически выделяется в куче, так как она создается «new». Но когда я отлаживал программу, адрес, возвращаемый SVMFeatureExtraction, не может быть успешно присвоен SVMNodes (SVMNodes всегда «NULL»), хотя содержимое pNodes верное. Может ли кто-нибудь сказать мне, что не так с кодом?

спасибо.

+0

Перед тем как вернуться из 'SVMFeatureExtraction', попробуйте напечатать литые значения int' pNodes', также напечатайте 'SVMFeatureExtraction (inputData, & dataNum, & n, actWeight)' без присвоения. –

+0

Пара вопросов: Вы уверены, что 'inputData-> GetFrameSaved()' возвращает значение> 0? Кроме того, вы уверены, что это 'pNodes' выделяется в памяти внутри' SVMFeatureExtraction() ' – Tom

+0

Ваша строка с ошибкой ссылается на переменную, которая не существует (dataNum). Это предназначено? –

ответ

4

Это может быть глупым предложением, но вы абсолютно уверены, что эта часть никогда не бывает?

if (!CalFeatureVector(inputData, i+1, j+1, pVec, wt)) 
    return NULL; 
+0

Я думаю, вы правы! ... Как я мог упустить это? .. В любом случае, спасибо за ваш ответ! – eaglesky

+0

Случается к лучшему из нас ;-) Рад, что это помогло! – Kaiwa

-1
*pFeatureNum = FEATURENUM; 
    *pFrameNum = inputData->GetFrameSaved(); 
    svm_node** pNodes = new svm_node*[*pFrameNum]; 

Это странно, вы пытаетесь изменить значение указателя вместо указанного значения. И почему вы передаете два аргумента указателем и повторно инициализировали его в своей функции?

попробовать это:

pFeatureNum = FEATURENUM; 
pFrameNum = inputData->GetFrameSaved(); 
svm_node** pNodes = new svm_node[pFrameNum]; 
for (int i = 0; i < pFrameNum; i++) 
    { 
     pNodes[i] = new svm_node[FEATURENUM + 1]; 
     for (int j = 0; j < FEATURENUM/3; j++) 
     { 
      FEATURE_VEC* pVec = new FEATURE_VEC; 
      if (!CalFeatureVector(inputData, i+1, j+1, pVec, wt)) 
       return NULL; 

      pNodes[i][j*3].index = j*3 + 1; 
      pNodes[i][j*3].value = pVec->x; 

      pNodes[i][j*3 + 1].index = j*3 + 2; 
      pNodes[i][j*3 + 1].value = pVec->y; 

      pNodes[i][j*3 + 2].index = j*3 + 3; 
      pNodes[i][j*3 + 2].value = pVec->z; 

      delete pVec; 
     } 
     pNodes[i][FEATURENUM].index = -1; 
     pNodes[i][FEATURENUM].value = 0; 

    } 
+0

нет, чтобы изменить заостренную переменную, вы должны разыменовать ее. И распределение создает массив указателей, поэтому исходный код правильный. – didierc

+0

@ Nagasaki Извините, я не понимаю вашего ответа. PFeatureNum и pFrameNum являются указателями на int, почему вы присваиваете им значения int? Более того, правильно ли это утверждение? svm_node ** pNodes = новый svm_node [pFrameNum]; Кажется, вы назначили указатель на svm_node указателю на указатель на svm_node .. – eaglesky

+0

, например, если вы это сделаете * i = 1, это похоже на то, что адрес i равен 1. Чтобы изменить значение, указанное i, вы просто сделаете i = 1; – Nagasaki

-1

Попробуйте это (незначительное изменение в ответ @ Нагасаки):

*pFeatureNum = FEATURENUM; 
*pFrameNum = inputData->GetFrameSaved(); 
svm_node** pNodes = new svm_node[*pFrameNum]; 
for (int i = 0; i < *pFrameNum; i++) 
    { 
     pNodes[i] = new svm_node[FEATURENUM + 1]; 
... 

(и, если он работает, принимает @ ответ NAGASAKI и я буду редактировать его таким образом они получают кредит)

Смежные вопросы