【问题标题】:Function returning pointer to pointer函数返回指向指针的指针
【发布时间】:2013-04-10 10:35:40
【问题描述】:

请看我下面的代码:

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的内容是正确的。谁能告诉我代码有什么问题?

谢谢。

【问题讨论】:

  • 在从SVMFeatureExtraction返回之前尝试打印转换为pNodes的int值,同时打印SVMFeatureExtraction(inputData, &amp;dataNum, &amp;n, actWeight)而不分配。
  • 几个问题:你确定inputData-&gt;GetFrameSaved() 返回的值 > 0?另外,你确定这个pNodes 是在SVMFeatureExtraction() 内分配内存
  • 您的错误行引用了一个不存在的变量 (dataNum)。这是故意的吗?
  • @Tom 我百分百确定。当我在“SVMNodes = SVMFeatureExtraction(inputData, &dataNum, &n, actWeight); ”之后调试到下一行时,dataNum 和 n 都得到了正确的值。它们都是函数 SVMFeatureExtraction 的输出。
  • Roger that... 让我再看一遍。我认为@Nagasaki 在这方面很接近

标签: c++ function pointers return


【解决方案1】:

这可能是一个愚蠢的建议,但你绝对确定这部分永远不会发生吗?

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

【讨论】:

  • 我猜你是对的! ...我怎么能忽略它!..无论如何,谢谢你的回答!
  • 发生在我们最好的人身上 ;-) 很高兴它有帮助!
【解决方案2】:
*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;

    }

【讨论】:

  • 不,要修改指向的变量,您必须取消引用它。并且分配创建了一个指针数组,所以原来的代码是正确的。
  • @Nagasaki 对不起,我不明白你的答案.. pFeatureNum 和 pFrameNum 是指向 int 的指针,你为什么要为它们分配 int 值?此外,这种说法正确吗? svm_node** pNodes = new svm_node[pFrameNum];看来您将指向 svm_node 的指针分配给指向 svm_node 的指针的指针..
  • 例如如果你这样做*i = 1,就像说i的地址是1。要改变i指向的值,你只需i = 1;
  • 如果你想创建一个指针,你可以这样做 svm_node* pNodes = new svm_node;精确的?而指针的指针是 svm_node** pNodes = new svm_node[pFrameNum];这实际上是一个指针数组。
  • @Nagasaki - 读取*i = 1 的方式是“将1 分配给i 的内容”
【解决方案3】:

试试这个(对@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];
...

(如果可行,请接受@Nagasaki 的回答,我将对其进行编辑,以便他们获得荣誉)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多