Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 1.9.2-p-180因';非法指令';或';堆栈级别太深(SystemStackError)';_Ruby_Rvm - Fatal编程技术网

Ruby 1.9.2-p-180因';非法指令';或';堆栈级别太深(SystemStackError)';

Ruby 1.9.2-p-180因';非法指令';或';堆栈级别太深(SystemStackError)';,ruby,rvm,Ruby,Rvm,行为:Ruby 1.9.2p180失败,指令非法,没有其他细节。Ruby 1.9.1p378运行完全没有问题 失败发生在行pin=fronto.index(k),仅在一些迭代中 from和into都是对象数组,by是该对象的属性(x或y) 守则: def add_from_to_by from, into, by nto = into.sort_by{|k| k.send(by)} fronto = (from + nto).sort_by{|k| k.send(by)}

行为:Ruby 1.9.2p180失败,指令非法,没有其他细节。Ruby 1.9.1p378运行完全没有问题

失败发生在行
pin=fronto.index(k)
,仅在一些迭代中

from
into
都是对象数组,
by
是该对象的属性(x或y)

守则:

  def add_from_to_by from, into, by
    nto = into.sort_by{|k| k.send(by)}
    fronto = (from + nto).sort_by{|k| k.send(by)}
    dict = {}
    nto.each{|k| dict[k] = []}
    nto.each do |k|
      pin = fronto.index(k)
      up = pin+1
      down = pin-1
      while up < fronto.length and ((fronto[pin].send(by)) - (fronto[up].send(by))).abs <= $sensor_range
        if fronto[up].kind_of?(BasicNode) then 
          dict[k].push(fronto[up]) 
        end
        up += 1
      end
      while down >= 0 and ((fronto[pin].send(by)) - (fronto[down].send(by))).abs <= $sensor_range
        if fronto[down].kind_of?(BasicNode)
          dict[k].push(fronto[down])
        end
        down -= 1
      end
    end
    return dict
  end 
这将复制最后一行中的错误。 在崩溃的输入中,into和from是不相交的点集。应该有效的类定义是:

class BasicNode
    attr_reader :x, :y
    def initialize x, y
        @x = x
        @y = y
    end
end
其中x和y是数字。在崩溃的测试中,
中有15个节点进入
,而
中有5个节点来自

编辑:

当我稍微隔离代码时,我确实得到了一个
堆栈级别太深(系统堆栈错误)
。但是,我不确定为什么会这样,因为在这段代码或数组索引的C实现中没有递归调用

附录:此问题的完整源代码可在此处找到:

存储库:ServerTex 分支:默认
测试文件:test/test_deeps_hypersim.rb

在linux上使用1.9.2-p180,我无法重现您的问题。以下是我的测试设置:

$sensor_range=5
list1=Array.new(1000) {|i| BasicNode.new(rand(100),rand(100))}
list2=Array.new(1000) {|i| BasicNode.new(rand(100),rand(100))}
res=add_from_to_by(list1,list2,:x);
您的错误是否仍然会出现在这组指令中?如果您仍然有bug,但没有使用这些指令,您能提供一些示例数据和函数调用来演示问题吗?(如果它很大,你可以使用像pastebin.com这样的服务)


此外,我不能100%确定它是否完全相同,但这可能是编写相同函数的更直接的方法(您的程序可能更容易用更简单的代码调试):


你能显示错误输出吗,或者你得到的只是“非法指令”吗?此外,您是否能够减少代码量,并且仍然复制错误?此外,导致错误崩溃的示例输入也会很好。您确定没有因为太多的递归而导致堆栈溢出,就像“非法指令”是唯一的输出一样。我有理由相信这不是一个递归问题,因为1.9.1完美地运行了它。如果以问题修订版中所示的方式减少上述方法,也会出现错误。您是否正确复制了BasicNode类?这是不合法的。方法定义要求其参数用逗号分隔,例如“def initialize x,y”而不是“def initialize x y”。我从内存中编写了BasicNode类。我将编辑它。这没有抛出错误。分析我的代码发现,1.9.1遇到了1.9.2没有看到的无方法错误(但出于某种原因,1.9.1忽略了无方法错误)。修改后的代码可能更干净,但以这种方式编写函数的原因是为了减少“from”中每个项的搜索时间。可能是杀伤力过大。
$sensor_range=5
list1=Array.new(1000) {|i| BasicNode.new(rand(100),rand(100))}
list2=Array.new(1000) {|i| BasicNode.new(rand(100),rand(100))}
res=add_from_to_by(list1,list2,:x);
def add_from_to_modified(from,into,sensor_range,&block)
  into.inject({}) do |result,key|
    result.merge({key=>(into+from).select {|check| (yield(check)-yield(key)).abs <= sensor_range}})
  end
end

add_from_to_modified(list1,list2,5,&:x)
add_from_to_modified(list1,list2,5) {|node| node.x*3-node.y}