gpt4 book ai didi

Ruby 1.9.2-p-180 失败,返回 'illegal instruction' 或 'stack level too deep (SystemStackError)'

转载 作者:数据小太阳 更新时间:2023-10-29 07:07:59 26 4
gpt4 key购买 nike

行为:Ruby 1.9.2p180 因“非法指令”而失败,没有其他详细信息。 Ruby 1.9.1p378 运行完全没有问题。

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

frominto 都是对象数组,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

我在 Mac 10.6.6 上使用 rvm 管理 ruby​​ 版本。知道为什么会这样吗?

修订:

如果上面的代码简化为:

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] = []}
x = nto.select{|k| !fronto.include?(k)}
end

这重现了最后一行的错误。在崩溃的输入中,进出点是不相交的点集。一个应该起作用的类定义是:

class BasicNode
attr_reader :x, :y
def initialize x, y
@x = x
@y = y
end
end

其中 x 和 y 是数字。在崩溃的测试中,into 中有 15 个节点,from 中有 5 个节点。

编辑:

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

附录:此问题的完整源代码可在此处找到:http://code.google.com/p/graphcomplexity/

仓库:rvertex分支:默认测试文件: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);

您的错误是否仍然出现在该组指令中?如果您仍然遇到错误,但没有按照这些说明进行操作,您能否提供一些示例数据和函数调用来演示该问题? (如果它很大,你可以使用像 pastebin.com 这样的服务)


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

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)

如果效率太低,可以在循环外用 yield() 重写。此实现还允许您传递任意 block ,而不仅仅是要调用的函数

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

关于Ruby 1.9.2-p-180 失败,返回 'illegal instruction' 或 'stack level too deep (SystemStackError)',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5386611/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com