【问题标题】:yew app - rustwasm error Uncaught RangeError: Maximum call stack size exceededyew app - rustwasm 错误 Uncaught RangeError: 超出最大调用堆栈大小
【发布时间】:2021-04-10 21:19:34
【问题描述】:

我试图以 Yew 应用程序解决数独问题。使用 yew="0.17.4" 版本。 但低于错误

Uncaught RangeError: Maximum call stack size exceeded
    at dlmalloc::dlmalloc::Dlmalloc::malloc::hb6b25cc27fa2f08c (wasm_bg.wasm:wasm-function[55]:0x5f0d)
    at __rdl_alloc (wasm_bg.wasm:wasm-function[327]:0x23108)
    at __rust_alloc (wasm_bg.wasm:wasm-function[362]:0x23480)
    at alloc::raw_vec::RawVec<T,A>::reserve::h02d54539a997f0ac (wasm_bg.wasm:wasm-function[211]:0x207e4)
    at <&mut W as core::fmt::Write>::write_str::he2cb1047a173d57a (wasm_bg.wasm:wasm-function[288]:0x22a02)
    at core::fmt::Formatter::pad_integral::hfd6532b3a41ee584 (wasm_bg.wasm:wasm-function[104]:0x16c73)
    at core::fmt::num::imp::fmt_u64::h5081cd6222065ff2 (wasm_bg.wasm:wasm-function[156]:0x1cecb)
    at core::fmt::num::imp::<impl core::fmt::Display for u32>::fmt::hd7239ff7b4d279a9 (wasm_bg.wasm:wasm-function[388]:0x23617)
    at <&T as core::fmt::Display>::fmt::h8b339f7b56577d63 (wasm_bg.wasm:wasm-function[392]:0x2364d)
    at core::fmt::write::h8b996d8af01475c9 (wasm_bg.wasm:wasm-function[103]:0x16b15)

https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=16e0219070bd7245a50a209de0ce2cd4

【问题讨论】:

  • “超出最大调用堆栈大小”是堆栈溢出错误。这意味着在您的代码中的某处您有一个无法正确退出的递归

标签: rust webassembly yew


【解决方案1】:

让我们回顾一下您的 solve 函数:

fn solve(&mut self)-> bool{
    match self.getemptycell(){
        Some((row,col)) => {
            for value in 1..10{
                if self.IsValidValue(row,col,value){
                    let index = (row*8 + row) + col ;
                    self.cellule[(row*8+row)+col].value = value;
                    log::info!("value = {}",value);
                    if self.solve(){ // <----------------------------- Recursion starts here
                        return true

                    }
                    self.cellule[(row*8+row)+col].value = 0;
                }

            }
            return false
        },
        _      =>   { 
            // log::info!("{:?}",self.cellule);
            return true
        },

    }

}
  • 该函数会检查一些值,如果这些值符合条件,则函数会再次调用自身 (line 90)。
  • 然后它会在相同的条件下检查相同的值并再次调用自己一次。
  • 再来一次。
  • 再来一次。
  • ...
  • 直到堆栈溢出为止。

你应该更加小心递归调用。

【讨论】:

  • 如果求解返回 true,self.getemptycell 将设置为非空(某个值)。一旦所有值都设置为非空,我认为 self.getemptycell 返回 "None" 。如果返回 NOne,递归就会停止,对吧?
  • “一旦所有值都设置为非空”——它永远不会发生,因为该方法在第一个元素处理期间调用自身。它可能永远不会处理for value in 1..10 中的第二个元素。
  • 我在 for 循环中设置值。 self.cellule[(row*8+row)+col].value = value;任何想法/提示来修改此代码以避免无限循环?
  • 您的代码打印输出的价值是什么?如果我的假设是正确的,它将一直打印value = 1
  • 我设法解决了它。它实际上是在更新 cells.self.cellule[(row*8+row)+col].value = value。那里没有问题。问题是我用错误的“行”和“col”初始化了一个单元格
猜你喜欢
  • 2017-12-12
  • 2014-06-11
  • 2017-05-23
  • 1970-01-01
  • 2015-08-22
  • 2018-03-18
  • 2011-12-01
  • 1970-01-01
相关资源
最近更新 更多