2010-06-13 19 views
5

मैं जानना चाहता हूं कि रणनीतियों क्या हैं? (यदि रणनीतियों मौजूद है)।क्या सी में पायथन ट्यूपल्स का अनुकरण करना संभव है?

+0

सी ++ में, आप TR1 या बूस्ट टुपल लाइब्रेरी का उपयोग कर सकते हैं। – anno

+0

जानकारी के लिए धन्यवाद, लेकिन मेरे मामले में सी ++ एक विकल्प नहीं है। –

+0

पायथन एक वर्चुअल मशीन पर चलने वाली गतिशील भाषा है। सी नंगे हड्डियों मशीन कोड के लिए संकलित। सी में पाइथन ट्यूपल के सटीक अर्थशास्त्र प्राप्त करने का कोई तरीका नहीं है, आप पाइथन ट्यूपल की क्या विशेषताएं देख रहे हैं? निरंतर तत्वों की मनमानी मात्रा का समूह बनाना? एकाधिक असाइनमेंट? सरणी सूचकांक द्वारा एक्सेस? – rossipedia

उत्तर

5

एक वस्तु है कि विभिन्न बुनियादी प्रकार के एक नंबर से एक पकड़ सकता है लागू करने के लिए सी में एक ठेठ पैटर्न एक struct युक्त एक तत्व का उपयोग करने के लिए है के साथ सी में LinuxTuples जो संभावित मूल प्रकारों के union को संग्रहीत किया जा सकता है, और एक तत्व जो enum है, इस मामले में union का उपयोग किस प्रकार किया जा रहा है।

फिर आप ऐसी वस्तुओं की एक सरणी का उपयोग कर सकते हैं, शायद struct के रूप में प्रतिनिधित्व किया गया है जिसमें कई आइटम हैं, और उन वस्तुओं के लिए भंडारण के लिए एक सूचक।

उदा। इस तरह कुछ:

#include <stdio.h> 
#include <stdlib.h> 

typedef enum tuple_datatype_e { 
    TUPLE_DATATYPE_INT, 
    TUPLE_DATATYPE_FLOAT, 
    TUPLE_DATATYPE_STRING 
} tuple_datatype_t; 

typedef struct tuple_item_s { 
    tuple_datatype_t datatype; 
    union { 
     int int_val; 
     float float_val; 
     char *string_val; 
    } u; 
} tuple_item_t; 

typedef struct tuple_s { 
    unsigned int n_items; 
    tuple_item_t *items; 
} tuple_t; 

static void print_tuple(tuple_t *t) 
{ 
    unsigned int i; 

    printf("("); 
    for (i = 0; i < t->n_items; i++) { 
     if (i > 0) 
      printf(", "); 
     switch (t->items[i].datatype) { 
     case TUPLE_DATATYPE_INT: 
      printf("%d", t->items[i].u.int_val); 
      break; 
     case TUPLE_DATATYPE_FLOAT: 
      printf("%f", t->items[i].u.float_val); 
      break; 
     case TUPLE_DATATYPE_STRING: 
      printf("\"%s\"", t->items[i].u.string_val); 
      break; 
     } 
    } 
    printf(")\n"); 
} 

int main(void) 
{ 
    tuple_t foo; 

    foo.n_items = 3; 
    foo.items = malloc(sizeof(tuple_item_t) * foo.n_items); 
    foo.items[0].datatype = TUPLE_DATATYPE_INT; 
    foo.items[0].u.int_val = 123; 
    foo.items[1].datatype = TUPLE_DATATYPE_FLOAT; 
    foo.items[1].u.float_val = 4.56; 
    foo.items[2].datatype = TUPLE_DATATYPE_STRING; 
    foo.items[2].u.string_val = "789"; 
    print_tuple(&foo); 

    return 0; 
} 
+0

+1 लेकिन ए) मैं tuples के निर्माण और प्रबंधन को संभालने के लिए सहायक कार्यों को लिखूंगा, बी) आपको 'unsigned int n_items' के बजाय 'size_t n_items' का उपयोग करना चाहिए, और सी) टाइपनाम '_t' के साथ समाप्त आरक्षित हैं, इसलिए आपको एक अलग सम्मेलन का उपयोग करना चाहिए। –

3

सी में पाइथन टुपल्स के सबसे नज़दीक शायद या तो structs या arrays है, इस पर निर्भर करता है कि आप उनका उपयोग कैसे करेंगे।

यदि आप संभावित रूप से विभिन्न प्रकार के संबंधित मानों की निश्चित संख्या को समूहबद्ध करना चाहते हैं तो structs का उपयोग करें।

यदि आप एक ही प्रकार के कई मान और सरणी में अनुक्रमणित करने की क्षमता चाहते हैं तो सरणी का उपयोग करें।

+0

क्या मूल्यों की एक परिवर्तनीय संख्या (विभिन्न प्रकारों) के साथ structs को परिभाषित करना संभव है? शायद एक मैक्रो का उपयोग कर? –

1

हालांकि बिल्कुल वही नहीं है, एक कॉन्स सरणी में कम से कम कुछ गुण हैं। यदि आपको अधिक सटीक अनुकरण की आवश्यकता है, तो एडीटी चाल कर सकता है।

+0

एडीटी क्या है। (जो मुझे पता है एडीटी सार डेटा प्रकार के लिए है)। –

+0

हां एक अमूर्त डेटा प्रकार :) – harald

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