请查看下面的代码:
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 :(得分:4)
这可能是一个愚蠢的建议,但你绝对肯定这一部分永远不会发生吗?
if (!CalFeatureVector(inputData, i+1, j+1, pVec, wt))
return NULL;
答案 1 :(得分:-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;
}
答案 2 :(得分:-1)
试试这个(对@ Nagasaki的回答略有修改):
*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];
...
(并且,如果它有效,请接受@长崎的回答,我会对其进行编辑,以便获得荣誉)