Действительно ли возможно подражать кортежам Python в C?

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

5
задан Andrei Ciobanu 13 June 2010 в 20:27
поделиться

4 ответа

Типичным шаблоном в C для реализации объекта, который может содержать один из нескольких различных базовых типов, является использование структуры , содержащей один элемент, который является объединение возможных базовых типов, которые могут быть сохранены, и один элемент, который представляет собой перечисление , определяющее, для какого из этих типов используется объединение в данном случае.

Затем вы можете использовать массив таких объектов, возможно, представленный в виде 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;
}
5
ответ дан 13 December 2019 в 22:02
поделиться

Там LinuxTuples на C с API

http://linuxtuples.sourceforge.net/

1
ответ дан 13 December 2019 в 22:02
поделиться

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

1
ответ дан 13 December 2019 в 22:02
поделиться

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

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

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

3
ответ дан 13 December 2019 в 22:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: