2015-04-18 6 views
6

मैं असली दुनिया हास्केल से एक उदाहरण संकलित करने के लिए कोशिश कर रहा हूँ (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 पोर्टेबल नहीं है, है ना?

उत्तर

8

समस्या यह है कि आपने CSize को एक अमूर्त प्रकार के रूप में आयात किया है। एफएफआई Word64 जैसे प्रकार के नए प्रकार के लिपटे संस्करणों की अनुमति देता है, लेकिन केवल तभी यह वास्तव में निहित प्रकार देख सकता है।

आपके मामले में, उचित आयात लाइन को बदलने

import Foreign.C.Types (CSize(..)) 

के चाल करना चाहिए। विदेशी घोषणा में अस्वीकार्य तर्क प्रकार "::

+2

और 7.10.1 एक बेहतर त्रुटि संदेश देता है 'CSize' एक विदेशी कॉल में मार्शल नहीं किया जा सकता, क्योंकि इसके डेटा कंसट्रक्टर गुंजाइश संभावित दुविधा में नहीं है: करने के लिए डेटा निर्माता आयात इसे दायरे में लाएं " –

+0

उसने ऐसा किया! धन्यवाद! – esato1981

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