tags:

views:

151

answers:

4

I am just curious to know what are the strategies ? (If the strategies exists).

+3  A: 

The closest to Python tuples in C is probably either structs or arrays, depending on how you will use them.

Use structs if you want to group a fixed number of related values of possibly different types.

Use arrays if you want a number of values of the same type and the ability to index into the array.

Mark Byers
Is it possible to define structs with a variable number of values (of different types) ? Maybe using a MACRO ?
Andrei Ciobanu
+1  A: 

Although not exactly the same, a const array has at least some of the same properties. If you require more exact emulation, an ADT could do the trick.

harald
What's an ADT. (for what I know ADT stands for Abstract Data Type).
Andrei Ciobanu
Yes an abstract data type :)
harald
+1  A: 

There the LinuxTuples in C with an API

http://linuxtuples.sourceforge.net/

jim mcnamara
+5  A: 

A typical pattern in C for implementing an object that can hold one of a number of different basic types is to use a struct containing one element which is a union of the possible basic types that can be stored, and one element which is an enum identifying which of those types the union is being used for in this case.

Then you could use an array of such objects, perhaps represented as a struct containing a number of items, and a pointer to the storage for those items.

e.g. something like this:

#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;
}
Matthew Slattery
+1 but a) I would write helper functions to handle the creation and management of tuples, b) you should use `size_t n_items` instead of `unsigned int n_items`, and c) typenames that end with `_t` are reserved, so you should use a different convention.
Chris Lutz