2013-10-10 3 views
1

Cudd 패키지를 사용하여 Visual C에서 알고리즘을 구현하려고합니다. 재귀 적으로 함수를 사용해야합니다. 그러나 특정 라인에서 오류가 계속 발생합니다. 오류는 입니다. 액세스 위반 읽기 위치는 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()는 노드와 그 모든 자식을 재귀 적으로 삭제합니다. 따라서 bdd_node가 Cudd_RecursiveDeref()를 사용하여 참조 해제 될 때마다 bdd_result도 제거되었으며 해당 값은 함수에 의해 반환되지 않았습니다. 따라서 리턴 값을 유지하려면 대신 Cudd_Deref()를 사용하십시오. 자식 노드를 삭제하지 않고 참조 횟수를 줄입니다.