2011-03-22 12 views
6

व्यवहार में रूबी 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

+0

पर कॉल करने के बजाए एक मनमाने ढंग से ब्लॉक को पास करने देता है, क्या आप त्रुटि आउटपुट दिखा सकते हैं, या आपको "अवैध निर्देश" मिल गया है?साथ ही, क्या आप अपने पास मौजूद कोड की मात्रा को कम करने में सक्षम हैं और अभी भी बग को पुन: उत्पन्न कर सकते हैं? –

+0

इसके अलावा, नमूना इनपुट जो इसे क्रैश करने का कारण बनता है भी अच्छा होगा। क्या आप वाकई बहुत अधिक रिकर्सन से स्टैक ओवरफ़्लो नहीं प्राप्त कर रहे हैं, जैसे http://stackoverflow.com/questions/2672438/ruby-1-9-ramaze-app-failing-with-illegal-instruction –

+0

'अवैध निर्देश 'एकमात्र आउटपुट है। मुझे काफी विश्वास है कि यह एक रिकर्सन समस्या नहीं है, क्योंकि 1.9.1 इसे पूरी तरह से चलाता है। प्रश्न संशोधन में दिखाए गए तरीके से उपर्युक्त विधि कम होने पर भी बग भी होगा। – philosodad

उत्तर

2

पर 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) 

यह उपज के साथ() रों लूप के बाहर फिर से लिखा जा सकता है कि अगर बहुत अक्षम है। यह कार्यान्वयन आपको

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

इसने कोई त्रुटि नहीं फेंक दी। मेरे कोड को प्रोफाइल करने में पाया गया कि 1.9.1 को कोई विधि त्रुटि नहीं मिल रही है जो 1.9.2 नहीं देख रहा है (लेकिन किसी कारण से, 1.9.1 अनदेखा कर रहा है कि कोई विधि त्रुटि नहीं है। संशोधित कोड शायद क्लीनर है, लेकिन लिखने का तर्क इस तरह से कार्य करें "से" में प्रत्येक आइटम के लिए खोज समय को कम करने के लिए। संभवतः ओवरकिल। – philosodad

संबंधित मुद्दे