Место чтения нарушения доступа с использованием Cudd

Я пытаюсь реализовать алгоритм в Visual C с использованием пакета Cudd. Я должен использовать функцию рекурсивно. Но он продолжает выдавать ошибку в одной конкретной строке. Ошибка: адрес чтения нарушения доступа 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);
}
}

1 ответ

Решение

Cudd_RecursiveDeref() рекурсивно удаляет узел и все его дочерние элементы. Поэтому всякий раз, когда bdd_node разыменовывался с помощью Cudd_RecursiveDeref(), bdd_result также удалялся, и его значение не возвращалось функцией. Поэтому, чтобы сохранить значение для возврата, используйте вместо этого Cudd_Deref(). Он просто уменьшает количество ссылок, не удаляя его дочерние узлы.

Другие вопросы по тегам