是否有可能在C中模仿python元组?

时间:2010-06-13 20:27:14

标签: c tuples

我很想知道有什么策略? (如果策略存在)。

4 个答案:

答案 0 :(得分:5)

C中用于实现可以容纳多种不同基本类型之一的对象的典型模式是使用包含一个元素的struct,该元素是可能的基本类型的union存储,以及一个enum元素,用于标识union在这种情况下使用的那些类型。

然后你可以使用这样的对象数组,可能表示为包含许多项的struct,以及指向这些项的存储的指针。

e.g。像这样的东西:

#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;
}

答案 1 :(得分:3)

C中最接近Python元组的可能是结构或数组,具体取决于你将如何使用它们。

如果要对可能不同类型的固定数量的相关值进行分组,请使用结构。

如果您想要多个相同类型的值以及索引数组的能力,请使用数组。

答案 2 :(得分:1)

尽管不完全相同,但const数组至少具有一些相同的属性。如果你需要更精确的仿真,ADT就可以做到这一点。

答案 3 :(得分:1)

C中的LinuxTuples带有API

http://linuxtuples.sourceforge.net/