Можно ли имитировать кортежи Python в C? - PullRequest
5 голосов
/ 14 июня 2010

Мне просто интересно узнать, каковы стратегии? (Если стратегии существуют).

Ответы [ 4 ]

5 голосов
/ 14 июня 2010

Типичным шаблоном в C для реализации объекта, который может содержать один из нескольких различных базовых типов, является использование struct, содержащего один элемент, который представляет собой 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;
}
3 голосов
/ 14 июня 2010

Ближайший к Python кортежам в C, вероятно, являются структуры или массивы, в зависимости от того, как вы будете их использовать.

Используйте структуры, если вы хотите сгруппировать фиксированное количество связанных значений, возможно, разных типов.

Используйте массивы, если вам нужно несколько значений одного типа и возможность индексировать в массив.

1 голос
/ 14 июня 2010

Там LinuxTuples в C с API

http://linuxtuples.sourceforge.net/

1 голос
/ 14 июня 2010

Хотя не совсем то же самое, массив const имеет по крайней мере некоторые из тех же свойств. Если вам требуется более точная эмуляция, ADT может сделать свое дело.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...