Je suis simplement curieux de savoir quelles sont les stratégies? (Si les stratégies existent).Est-il possible d'imiter des tuples python en C?
Répondre
Un motif typique en C pour la mise en oeuvre d'un objet qui peut contenir l'un d'un certain nombre de différents types de base consiste à utiliser un struct
contenant un élément qui union
des types de base possibles pouvant être stockés, et un élément enum
identifiant lequel de ces types union
est utilisé dans ce cas.
Ensuite, vous pouvez utiliser un tableau de tels objets, peut-être représenté par un struct
contenant un certain nombre d'éléments, et un pointeur vers le stockage de ces éléments.
par exemple. Quelque chose comme ceci:
#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 mais a) J'écrirais des fonctions auxiliaires pour gérer la création et la gestion des tuples, b) vous devriez utiliser 'size_t n_items' au lieu de' unsigned int n_items', et c) des noms de caractères fin avec '_t' sont réservés, vous devriez donc utiliser une convention différente. –
Le plus proche de tuples Python dans C est probablement soit des structures ou des tableaux, selon la façon dont vous allez les utiliser.
Utilisez des structures si vous souhaitez regrouper un nombre fixe de valeurs associées de types éventuellement différents. Utilisez les tableaux si vous voulez un certain nombre de valeurs du même type et la possibilité d'indexer dans le tableau.
Est-il possible de définir des structures avec un nombre variable de valeurs (de types différents)? Peut-être en utilisant une MACRO? –
Bien que pas exactement la même chose, un tableau const a au moins certaines des mêmes propriétés. Si vous avez besoin d'émulation plus précise, un ADT pourrait faire l'affaire.
Qu'est-ce qu'un ADT. (pour ce que je sais, ADT signifie Abstract Data Type). –
Oui un type de données abstrait :) – harald
Là, les LinuxTuples en C avec une API
En C++, vous pouvez utiliser le TR1 ou la Bibliothèque Tuple Boost. –
anno
Merci pour l'info, mais dans mon cas, C++ n'est pas une option. –
Python est un langage dynamique exécuté sur une machine virtuelle. C compile jusqu'au code machine bare-bones. Il n'y a aucun moyen que vous obteniez la sémantique exacte d'un tuple Python en C. Quelles sont les caractéristiques du tuple Python que vous recherchez? Regroupement d'une quantité arbitraire d'éléments constants? Affectation multiple? Accès par index de tableau? – rossipedia