【问题标题】:Access violation reading location using Cudd使用 Cudd 访问冲突读取位置
【发布时间】:2014-04-28 23:58:30
【问题描述】:

我正在尝试使用 Cudd 包在 Visual C 中实现算法。我必须递归地使用一个函数。但它不断在某一行抛出错误。错误是访问冲突读取位置 0x00594a5ct。它与 temp_bdd_result 的用法相悖。我无法弄清楚为什么会发生这种情况,因为 temp_bdd_result-bdd_node 和 bdd_result 中使用的两个值都包含值。那么为什么它们无法访问。或者这个错误指向我看不到的其他东西。请帮忙。

DdNode* Path_Function_Construct(DdManager *manager,int matrix[3][3],int source)
{
DdNode *bdd_node,*bdd_result,*e,*temp_bdd_node,*temp_bdd_result;
if (source>=rows)
    return Cudd_ReadOne(manager);
else
{
    bdd_result=Cudd_ReadZero(manager);
    Cudd_Ref(bdd_result);
    for (int j=0;j<columns;j++)
    {
    if (matrix[source][j]==1)
    {
            //Declaring temp variables 

            //This means that an edge exists between source and node in consideration
            e=Cudd_bddNewVar(manager);
            Cudd_Ref(e);

            //Removing redundant nodes
            int new_matrix[3][3];
            for(int l=0;l<rows;l++)
                for(int m=0;m<columns;m++)
                    new_matrix[l][m]=matrix[l][m];
            for(int i=0;i<rows;i++)
                new_matrix[i][j]=0;

            //find path function using that node as a source
            temp_bdd_node=Path_Function_Construct(manager,new_matrix,j+1);

            Cudd_Ref(temp_bdd_node);
            bdd_node=Cudd_bddAnd(manager,e,temp_bdd_node);
            Cudd_Ref(bdd_node);
            temp_bdd_result=Cudd_bddIthVar(manager,4);
            temp_bdd_result=Cudd_bddAnd(manager,bdd_result,bdd_node); //this is where error is coming
            Cudd_Ref(temp_bdd_result);
            Cudd_RecursiveDeref(manager,bdd_result);
            bdd_result=temp_bdd_result;
            Cudd_Ref(bdd_result);
            Cudd_RecursiveDeref(manager,temp_bdd_node);
            Cudd_RecursiveDeref(manager,temp_bdd_result);
            Cudd_RecursiveDeref(manager,bdd_node);
            Cudd_RecursiveDeref(manager,e);
        } // end of if (matrix[source][j]==1)
    }// end of for loop
    return (bdd_result);
}
}

【问题讨论】:

    标签: visual-studio-2010 pointers recursion cudd


    【解决方案1】:

    Cudd_RecursiveDeref() 递归删除一个节点及其所有子节点。因此,每当使用 Cudd_RecursiveDeref() 取消引用 bdd_node 时,bdd_result 也会被删除,并且函数不会返回其值。因此,要保留返回的值,请改用 Cudd_Deref()。它只是减少引用计数而不删除其子节点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-04
      • 1970-01-01
      • 1970-01-01
      • 2021-12-31
      • 2016-05-28
      • 2017-01-09
      • 2014-11-09
      相关资源
      最近更新 更多