2013-10-10 58 views
1

我想在Visual C中使用Cudd包實現算法。我必須遞歸地使用一個函數。但它一直在一個特定的線路上拋出一個錯誤。錯誤是訪問衝突讀取位置0x00594a5ct。並且它正在抵制temp_bdd_result的使用。我無法弄清楚爲什麼會發生這種情況,因爲在temp_bdd_result-bdd_node & bdd_result中使用的值都包含值。那麼他們爲什麼不能訪問。或者這個錯誤指向了我無法看到的其他東西。請幫忙。使用Cudd訪問衝突讀取位置

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); 
} 
} 

回答

0

Cudd_RecursiveDeref()遞歸地刪除節點及其所有子節點。因此,無論何時使用Cudd_RecursiveDeref()取消引用bdd_node,bdd_result也會被刪除,並且其值不會被函數返回。所以要保留返回值Cudd_Deref()的值。它只是在不刪除其子節點的情況下減少引用計數。