यदि आप डेटा का उपयोग करते हैं। वेक्टर लाइब्रेरी आप डेटा.वेक्टर का उपयोग कर सकते हैं। आपकी आवश्यकताओं के लिए स्टाइल। फिर आप अंतर्निहित विदेशी सूचक तक पहुंचने के लिए unsafeToForeignPtr या unsafe जैसे फ़ंक्शंस का उपयोग कर सकते हैं। यह आपको किसी भी प्रतिलिपि या मार्शलिंग के बिना सी-कोड कॉल करने की अनुमति देता है।
यदि आप सी-सरणी से वेक्टर बनाना चाहते हैं तो आप unsafeFromForeignPtr का उपयोग कर सकते हैं।
अपने उदाहरण आप उपयोग कर सकते हैं (यह मानते हुए c_foo यह तर्क संशोधित नहीं करता है) के लिए
import Foreign.Ptr
import Foreign.C.Types
import System.IO.Unsafe (unsafePerformIO)
import qualified Data.Vector.Storable as SV
foreign import ccall unsafe "foo" c_foo :: Ptr CInt -> CInt
haskellFoo :: SV.Vector CInt -> CInt
haskellFoo sv = unsafePerformIO $
SV.unsafeWith sv $ \ptr -> return (c_foo ptr)
यह करने के लिए golfed जा जा सकता है:
haskellFoo sv = unsafePerformIO $
SV.unsafeWith sv (return . c_foo)
ध्यान रखें कि आपके सी समारोह डेटा को संशोधित करता है, तो , तो आपको यह नहीं करना चाहिए, इसके बजाय आपको संदर्भित पारदर्शिता को तोड़ने के लिए डेटा की एक प्रति बनाना चाहिए।
यदि आप मानक ऐरे-प्रकार का उपयोग करना चाहते हैं तो आप withStorableArray
Data.Array.Storable
से उसी तरह उपयोग कर सकते हैं।
सी [ 'Foreign.Marshal.Array'] (http://hackage.haskell.org/ पैकेज/आधार 4.7.0.0/docs/विदेशी मार्शल-Array.html)। – MasterMastic