2010-03-08 7 views
5

मुझे कोको में कार्बन विधि का अनुवाद करने की आवश्यकता है और मुझे कार्बन विधि प्राप्त करने के बारे में कोई दस्तावेज खोजने में परेशानी हो रही है। वास्तव में क्या करता है। जिस कोड से मैं अनुवाद कर रहा हूं, ऐसा लगता है कि यह एक छवि के बाइट प्रतिनिधित्व को लौटाता है लेकिन यह वास्तव में नाम से मेल नहीं खाता है। क्या कोई मुझे इस विधि का एक अच्छा स्पष्टीकरण दे सकता है या मुझे कुछ दस्तावेज से लिंक कर सकता है जो इसका वर्णन करता है। जिस कोड का मैं अनुवाद कर रहा हूं वह एमसीएल नामक एक सामान्य लिस्प कार्यान्वयन में है जिसमें कार्बन के लिए एक पुल है (मैं सीसीएल में अनुवाद कर रहा हूं जो कोको पुल के साथ एक आम लिस्प कार्यान्वयन है)। यहाँ एमसीएल कोड है (#_before एक विधि कॉल मतलब है कि यह एक कार्बन विधि है कि):कार्बो विधि के कोको समकक्ष getPtrSize

(defmethod COPY-CONTENT-INTO ((Source inflatable-icon) 
           (Destination inflatable-icon)) 
    ;; check for size compatibility to avoid disaster 
    (unless (and (= (rows Source) (rows Destination)) 
       (= (columns Source) (columns Destination)) 
       (= (#_getPtrSize (image Source)) 
        (#_getPtrSize (image Destination)))) 
    (error "cannot copy content of source into destination 
inflatable icon: incompatible sizes")) 
    ;; given that they are the same size only copy content 
    (setf (is-upright Destination) (is-upright Source)) 
    (setf (height Destination) (height Source)) 
    (setf (dz Destination) (dz Source)) 
    (setf (surfaces Destination) (surfaces Source)) 
    (setf (distance Destination) (distance Source)) 
    ;; arrays 
    (noise-map Source) ;; accessor makes array if needed 
    (noise-map Destination) ;; ;; accessor makes array if needed 
    (dotimes (Row (rows Source)) 
    (dotimes (Column (columns Source)) 
     (setf (aref (noise-map Destination) Row Column) 
      (aref (noise-map Source) Row Column)) 
     (setf (aref (altitudes Destination) Row Column) 
      (aref (altitudes Source) Row Column)))) 
    (setf (connectors Destination) 
     (mapcar #'copy-instance (connectors Source))) 
    (setf (visible-alpha-threshold Destination) 
     (visible-alpha-threshold Source)) 
    ;; copy Image: slow byte copy 
    (dotimes (I (#_getPtrSize (image Source))) 
    (%put-byte (image Destination) (%get-byte (image Source) i) i)) 
    ;; flat texture optimization: 
    ;; do not copy texture-id 
    ;; -> destination should get its own texture id from OpenGL 
    (setf (is-flat Destination) (is-flat Source)) 
    ;; do not compile flat textures: the display list overhead 
    ;; slows things down by about 2x 
    (setf (auto-compile Destination) (not (is-flat Source))) 
    ;; to make change visible we have to reset the compiled flag 
    (setf (is-compiled Destination) nil)) 
+1

यह वास्तविक है? मेरे दिमाग को उड़ाने के लिए +1। –

उत्तर

4

GetPtrSizeMemory Manager से एक समारोह है। जब आपने NewPtr (एक और मेमोरी मैनेजर फ़ंक्शन) के साथ मेमोरी आवंटित की, तो मेमोरी मैनेजर ट्रैक करेगा कि आपने कितनी मेमोरी मांगी है, ताकि आप उस नंबर को GetPtrSize से पुनर्प्राप्त कर सकें।

NewPtr के लिए आधुनिक प्रतिस्थापन malloc है, जो ऐसी कोई कार्यक्षमता प्रदान नहीं करता है। malloc_size फ़ंक्शन है, लेकिन जिस नंबर पर यह लौटाता है वह कुछ वृद्धि के लिए गोल किया जा सकता है, इसलिए यह मूल रूप से आपके द्वारा मांगी गई संख्या से अधिक हो सकता है। आप देख सकते हैं कि यह कैसे होगा (कम से कम अवधारणात्मक) बुरा।

GetPtrSize के लिए एकमात्र सटीक प्रतिस्थापन केवल बफर के आकारों का ट्रैक रखने के लिए है।

वैकल्पिक रूप से, आप इन बफर को NSMutableData ऑब्जेक्ट्स से प्रतिस्थापित कर सकते हैं। एक NSMutableData एक बफर और उसके आकार को encapsulates, जिससे उन्हें एक साथ रखना आसान बनाता है।