व्यवहार में रूबी 1.9.2p180 'अवैध निर्देश' और कोई अन्य विवरण के साथ विफल रहता है। रूबी 1.9.1p378 कोई समस्या नहीं है।रूबी 1.9.2-पी-180 'अवैध निर्देश' या 'ढेर स्तर बहुत गहराई से (सिस्टमस्टैक त्रुटि)'
विफलता केवल कुछ पुनरावृत्तियों पर 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
मैं मैक 10.6.6 पर गहरे लाल रंग का संस्करणों का प्रबंधन करने के rvm उपयोग कर रहा हूँ। कुछ पता है कि ऐसा क्यों हो रहा है?
संशोधन:
कोड ऊपर यह करने के लिए कम हो जाता है, तो:
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
यह अंतिम पंक्ति पर बग reproduces। जो क्रैश होता है, उसमें और बिंदुओं के अलग-अलग सेट होते हैं। एक वर्ग परिभाषा जो काम करनी चाहिए वह है:
class BasicNode
attr_reader :x, :y
def initialize x, y
@x = x
@y = y
end
end
जहां एक्स और वाई संख्याएं हैं। परीक्षण में क्रैश होने पर into
में 15 नोड्स और from
में 5 नोड्स हैं।
संपादित करें:
मैं मिलता है एक stack level too deep (System Stack Error)
जब मैं कोड कुछ हद तक अलग। हालांकि, मुझे यकीन नहीं है कि यह क्यों होना चाहिए, क्योंकि इस कोड में या सरणी अनुक्रमणिका के लिए सी कार्यान्वयन में कोई रिकर्सिव कॉल नहीं है।
परिशिष्ट: इस प्रश्न के लिए पूरा स्रोत कोड यहां पाया जा सकता: http://code.google.com/p/graphcomplexity/
भंडार: rvertex शाखा: डिफ़ॉल्ट परीक्षण फ़ाइल: परीक्षा/test_deeps_hypersim.rb
पर कॉल करने के बजाए एक मनमाने ढंग से ब्लॉक को पास करने देता है, क्या आप त्रुटि आउटपुट दिखा सकते हैं, या आपको "अवैध निर्देश" मिल गया है?साथ ही, क्या आप अपने पास मौजूद कोड की मात्रा को कम करने में सक्षम हैं और अभी भी बग को पुन: उत्पन्न कर सकते हैं? –
इसके अलावा, नमूना इनपुट जो इसे क्रैश करने का कारण बनता है भी अच्छा होगा। क्या आप वाकई बहुत अधिक रिकर्सन से स्टैक ओवरफ़्लो नहीं प्राप्त कर रहे हैं, जैसे http://stackoverflow.com/questions/2672438/ruby-1-9-ramaze-app-failing-with-illegal-instruction –
'अवैध निर्देश 'एकमात्र आउटपुट है। मुझे काफी विश्वास है कि यह एक रिकर्सन समस्या नहीं है, क्योंकि 1.9.1 इसे पूरी तरह से चलाता है। प्रश्न संशोधन में दिखाए गए तरीके से उपर्युक्त विधि कम होने पर भी बग भी होगा। – philosodad