2010-06-13 2 views
5

Sono solo curioso di sapere quali sono le strategie? (se esistono le strategie).È possibile imitare le tuple Python in C?

+0

In C++, è possibile utilizzare TR1 o Boost Tuple Library. – anno

+0

Grazie per le informazioni, ma nel mio caso il C++ non è un'opzione. –

+0

Python è un linguaggio dinamico eseguito su una macchina virtuale. C compila fino al codice macchina bare-bones. Non c'è modo di ottenere la semantica esatta di una tupla Python in C. Quali caratteristiche della tupla Python stai cercando? Raggruppamento di una quantità arbitraria di elementi costanti? Assegnazione multipla? Accesso tramite indice di array? – rossipedia

risposta

5

Un modello tipico in C per l'attuazione di un oggetto che può contenere uno di un certo numero di tipi di base è quella di utilizzare un unico elemento struct contenente cui è un union dei possibili tipi di base che possono essere memorizzati e un elemento che è un enum che identifica quale di questi tipi viene utilizzato in questo caso il union.

Quindi è possibile utilizzare una matrice di tali oggetti, rappresentata forse come struct contenente un numero di elementi e un puntatore all'archiviazione per tali elementi.

ad es. qualcosa di simile:

#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 ma a) Vorrei scrivere le funzioni di supporto per gestire la creazione e la gestione di tuple, b) dovresti usare 'size_t n_items' invece di' unsigned int n_items', e c) typenames che terminare con '_t' sono riservati, quindi dovresti usare una convenzione diversa. –

3

Il più vicino alle tuple Python in C è probabilmente una struttura o un array, a seconda di come verranno utilizzati.

Utilizzare le strutture se si desidera raggruppare un numero fisso di valori correlati di tipi possibilmente diversi.

Utilizzare gli array se si desidera un numero di valori dello stesso tipo e la possibilità di indicizzare nell'array.

+0

È possibile definire le strutture con un numero variabile di valori (di tipi diversi)? Forse usando un MACRO? –

1

Sebbene non esattamente uguale, un array const ha almeno alcune delle stesse proprietà. Se hai bisogno di un'emulazione più precisa, un ADT potrebbe fare il trucco.

+0

Cos'è un ADT. (per quello che so ADT sta per Abstract Data Type). –

+0

Sì un tipo di dati astratto :) – harald