【问题标题】:Segmentation fault in CUDD executionCUDD 执行中的分段错误
【发布时间】:2019-12-17 13:47:37
【问题描述】:

我使用的编译:

   1)  ./configure --enable-dddmp --enable-obj --enable-shared --enable-static; make
   2)  gcc test.c -o testprogram -I /path/to/cudd-3.0.0/cudd -I /path/to/cudd-3.0.0/util -I /path/to/cudd-3.0.0/ -static -L /path/to/cudd-3.0.0/cudd/.libs/ -lcudd -lm

程序编译成功。我正在使用 cudd3.0.0 包。之后我在执行中遇到了这个分段错误:

请建议执行此操作的正确方法以及为什么会出现此错误?

我正在添加主函数:

int main (int argc, char *argv[])
{
    char filename[30];
    DdManager *gbm; /* Global BDD manager. */
    gbm = Cudd_Init(0,0,CUDD_UNIQUE_SLOTS,CUDD_CACHE_SLOTS,0); /* Initialize a new BDD manager. */
    DdNode *bdd, *var, *tmp_neg, *tmp;
    int i;
    bdd = Cudd_ReadOne(gbm); /*Returns the logic one constant of the manager*/
    Cudd_Ref(bdd); /*Increases the reference count of a node*/

    for (i = 3; i >= 0; i--) {
        var = Cudd_bddIthVar(gbm,i); /*Create a new BDD variable*/
        tmp_neg = Cudd_Not(var); /*Perform NOT boolean operation*/
        tmp = Cudd_bddAnd(gbm, tmp_neg, bdd); /*Perform AND boolean operation*/
        Cudd_Ref(tmp);
        Cudd_RecursiveDeref(gbm,bdd);
        bdd = tmp;
    }

    bdd = Cudd_BddToAdd(gbm, bdd); /*Convert BDD to ADD for display purpose*/
    print_dd (gbm, bdd, 2,4);   /*Print the dd to standard output*/
    sprintf(filename, "./bdd/graph.dot"); /*Write .dot filename to a string*/
    write_dd(gbm, bdd, filename);  /*Write the resulting cascade dd to a file*/
    Cudd_Quit(gbm);
    return 0;
}

【问题讨论】:

    标签: c segmentation-fault bdd cudd


    【解决方案1】:

    是的,已解决。我没有在代码行的正确位置创建名为“bdd”的文件夹:

    sprintf(filename, "./bdd/graph.dot");
    

    现在,它正在执行。抱歉,我认为这是一些概念错误。

    【讨论】:

    • 请注意,丢失的文件夹绝不会导致段错误。据我所知,您自己编写了函数“write_dd”(它不是 CUDD 的一部分,也不是您发布的代码的一部分),如果丢失的文件夹导致段错误,您很可能没有检查返回值“fopen”调用(CUDD 的转储函数获取 FILE* 作为参数)。所以这个问题真的与CUDD无关。
    • 这只是我的情况下缺少的文件夹。 @DCTLib
    • 您是否使用 CUDD 包创建了 bdd 文件?我正在创建 BDD 并能够查看它,但无法将其存储在 BDD 文件中。 @DCTLib
    • 您正在使用 DDDMP 包来存储 BDD?
    • 你好像在看DDDMP的内部函数——使用的官方API可以在cs.uleth.ca/~rice/cudd_docs/dddmp/dddmpExt.html查看——使用起来不算太难,就是有点麻烦。但是,必须填充具有可变感兴趣索引的数组。确保解释返回值。在 google 上搜索使用 Dddmp_cuddBddStore 函数的示例。
    猜你喜欢
    • 1970-01-01
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多