मैं असली दुनिया हास्केल से एक उदाहरण संकलित करने के लिए कोशिश कर रहा हूँ (26 अध्याय):FFI: कैसे घोषित करने के लिए `size_t`
एक C
समारोह नहीं है मैं FFI
का उपयोग कर कॉल करना चाहते हैं:
#include <stdint.h>
#include <sys/types.h>
/* only accepts uint32_t aligned arrays of uint32_t */
void hashword2(const uint32_t *key, /* array of uint32_t */
size_t length, /* number of uint32_t values */
uint32_t *pc, /* in: seed1, out: hash1 */
uint32_t *pb); /* in: seed2, out: hash2 */
{-# LANGUAGE BangPatterns, ForeignFunctionInterface #-}
import Data.Word (Word32, Word64)
import Foreign.C.Types (CSize)
import Foreign.Marshal.Utils (with)
import Foreign.Ptr (Ptr, castPtr, plusPtr)
import Foreign.Storable (Storable, peek, sizeOf)
foreign import ccall unsafe "lookup3.h hashword2" hashWord2
:: Ptr Word32 -> CSize -> Ptr Word32 -> Ptr Word32 -> IO()
जब मैंने इसे ghc
संकलित करने के लिए कोशिश निम्न त्रुटि संदेश देता है:: यहाँ Haskell कोड है कि यह आयात करना चाहता है है
Unacceptable argument type in foreign declaration: CSize
When checking declaration:
foreign import ccall unsafe "static lookup3.h hashword2" hashWord2
:: Ptr Word32 -> CSize -> Ptr Word32 -> Ptr Word32 -> IO()
size_t
मार्शल के लिए मुझे किस प्रकार का उपयोग करना चाहिए? अगर मैं CSize
को प्रतिस्थापित करता हूं और Word64
का उपयोग करता हूं तो यह संकलित होगा, लेकिन Word64
पोर्टेबल नहीं है, है ना?
और 7.10.1 एक बेहतर त्रुटि संदेश देता है 'CSize' एक विदेशी कॉल में मार्शल नहीं किया जा सकता, क्योंकि इसके डेटा कंसट्रक्टर गुंजाइश संभावित दुविधा में नहीं है: करने के लिए डेटा निर्माता आयात इसे दायरे में लाएं " –
उसने ऐसा किया! धन्यवाद! – esato1981