首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ocaml中的异常"Stack_overflow“

ocaml中的异常"Stack_overflow“
EN

Stack Overflow用户
提问于 2011-01-05 22:23:00
回答 2查看 3.6K关注 0票数 2

我想问一下异常:"exception Stack_overflow“是否会导致无限循环,特别是在下面的代码中发生的异常:

代码语言:javascript
复制
    ( *the loop "while" should stop when both stacks are empty*)
    while (not (Stack.is_empty stackFalse) )|| ( not (Stack.is_empty stackTrue)) do     
    (
        if (not ( Stack.is_empty stackTrue )) then
        (
            let q1 = Stack.pop stackTrue in
            let (_,_,ptrs) = fst (Hashtbl.find graph ( fst q1) ) in
            List.iter ( fun elem -> 

                            let app = Hashtbl.find graph elem in
                            let (typeNode,last,ptrs')  = fst app in 

                            if typeNode = "Or-node" then
                            (
                                Stack.push (elem,true) stackTrue;
                                Hashtbl.add labeled elem true
                            )
                            else if last = false then                                                        
                                Hashtbl.replace graph elem ((typeNode,true,ptrs'),snd app)
                            else 
                            (
                                Stack.push (elem,true) stackTrue;
                                Hashtbl.add labeled elem true
                            )       ) ptrs ; 
         );

        if (not ( Stack.is_empty stackFalse )) then            
        (
            let q2 = Stack.pop stackFalse in
            let (_,_,ptrs1) = fst (Hashtbl.find graph (fst q2) )in

            List.iter ( fun elem -> 

                            let app = Hashtbl.find graph elem in
                            let (typeNode,last,ptrs')  = fst app in 

                            if typeNode = "And-node" then
                            (
                                Stack.push (elem,false) stackFalse;
                                Hashtbl.add labeled elem false
                            )                            
                            else if last = false then                                                        
                                Hashtbl.replace graph elem ((typeNode,true,ptrs'),snd app)
                            else 
                            (
                                Stack.push (elem,false) stackFalse;
                                Hashtbl.add labeled elem false
                            )   ) ptrs1 ;
        );

    )
    done; 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-01-05 22:52:23

标准急救:使用-g重新编译,并使用OCAMLRUNPARAM=b运行(参见手册)查看回溯。

PS我怀疑结构比较(例如,由Hashtbl.find使用),在hashtbl元素中是否有循环引用?

票数 10
EN

Stack Overflow用户

发布于 2011-01-06 07:52:39

当您进入调用者函数时,堆栈就会增长。while循环和尾部调用不会增加堆栈,因此这样的循环不会导致Stack_overflow错误。

正如ygrek所建议的,如果在循环数据结构上使用结构比较运算符=,它可能会引发堆栈溢出。您在代码中使用=,而Hashtbl模块在内部使用Pervasives.compare;如果hashtbl键是循环的,则所有键使用操作都可能进入无限循环。在这种情况下,一个很好的修复方法是使用模块化形式的Hasthbl (Hashtbl.Make),它允许您提供一个自定义的、支持循环性的相等函数。

堆栈溢出的一个更常见的原因是标准库的List模块的一些函数不是尾递归的。如果应用于具有足够小堆栈限制的足够大的列表,它们可能会导致堆栈溢出。在这种情况下,使用Extlib或电池的List模块--它提供了tailrec实现--是一个很好的修复方法。然而,这不是你的问题,因为List.iter已经是尾递归了。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4605091

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档