2015-03-03 8 views
25

से मनमाने ढंग से आकार वाले पूर्णांक पास करना अभी, मैं सीख रहा हूं कि सी कोड के साथ एसआईसीस्टस प्रोलॉग को कैसे इंटरफ़ेस करना है।प्रोलॉग से सी

मैं/उपयोग/SICStus Prolog संस्करण में मनमाने ढंग से आकार पूर्णांक "हैमिंग वजन" की एक सी कार्यान्वयन को देखने 4.

मुझे ऐसा लगता है कि मैं परीक्षण अवधि प्रकार के लिए सी कार्यों की जरूरत है (चाहते हैं SP_is_integer) और सी प्रोलॉग शब्दों तक पहुंचने के लिए कार्य करता है (SP_get_integer, SP_get_integer_bytes)।

हालांकि, मुझे यकीन नहीं है कि पोर्टेबल, मजबूत फैशन में SP_get_integer_bytes का उपयोग कैसे करें। क्या आप कृपया मुझे कुछ अच्छी तरह से तैयार किए गए ठोस सी कोड को इंगित कर सकते हैं?

+2

SP_get_integer_bytes() मनमाना परिशुद्धता पूर्णांकों के लिए है। –

उत्तर

14

इस तरह यह कुछ का उपयोग करें:

SP_term_ref tr = ... some term ... 
int native = 0; // want portable, little endian 
size_t buf_size = 0; 

if (!SP_get_integer_bytes(tr, NULL, &buf_size, native) 
    // if buf_size was updated, then there was not really an error 
    && buf_size == 0) 
{ 
    // Something wrong (e.g., not an integer) 
    return ERROR; 
} 

// here buf_size > 0 
void *buffer = SP_malloc(buf_size); 

if (buffer == NULL) 
{ 
    return ERROR; 
} 

if (!SP_get_integer_bytes(tr, buffer, &buf_size, native)) 
{ 
    // Something wrong. This would be surprising here 
    error(); 
} 

// Here buffer contains buf_size bytes, in 
// twos-complement, with the least significant bytes at lowest index. 
// ... do something with buffer ... 

// finally clean up 
SP_free(buffer); 
+2

यह किसी भी पूर्णांक के साथ काम करता है। यह किसी भी बफर के साथ काम करता है (उदाहरण के लिए आप एक स्थिर बफर का उपयोग कर सकते हैं जो आम तौर पर काफी बड़ा होता है, और उसके बाद एक गतिशील बफर आवंटित करता है जब स्थिर बफर में फिट करने के लिए पूर्णांक बहुत बड़ा होता है)। –