IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Création d'une table en C


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 14
    Par défaut Création d'une table en C
    Bonjour à tous,

    J'ai à concevoir une fonction permettant de créer une table en C. Selon ce que j'en sais, une table par définition est représentée par un tableau de structures en C. Cela ne me pose pas de problème à part un point: Je dois implanter cette fonction de telle sorte que l'utilisateur puisse, avec son appel, spécifier le type ainsi que le nom de chaque champs de la structure. Un fois ces données déterminées, elles doivent rester en place lors de la création des enregistrements de la table. Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    creerTable(int capacite, type1, nomType1, type2, nomType2)
    Bien sûr, capacite est un entier invariant indiquant le nombre d'élément que la table peut contenir... Type1 et nomType1 représententle type et le nom du premier champs de ma structure, idem pour type2, nomType2. Ce n'est pas faute d'avoir cherché, mais je n'ai trouvé à nulle part le moyen de modifier les types et noms des champs d'une structure à l'aide des paramètres de la fonction qui la contient. Ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void creerTable(int long, type1, nomChamps1)
    {
    typedef struct {
      type1 nomChamps1;
    } Enregistrement;
    Enregistrement* uneTable[long]; //Création tableau
    }
    Je sais, c'est complètement incohérent comme code C'est juste pour vous montrer comment je voudrais utiliser la paramètre de la fonction pour modifier le type de la structure.

    Bien qu'ayant une certaine expérience en C++, je suis un complet débutant en C. Peut-être y-a-t-il un moyen plus facile de faire ce je veux faire... SVP amis gourous du C, votre avis et votre aide seraient grandement appréciés

    PS J'ai fait bien des recherches infructueuses avant de m'adresser à vous!

  2. #2
    Membre très actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2011
    Messages : 247
    Par défaut
    Tu peux déclarer tous les champs comme float ou un autre type très "large" et ensuite faire un cast selon les choix de l'utilisateur.

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 14
    Par défaut Chaine
    C'est vrai Dré Kam. Cependant, les champs doivent pouvoir prendre n'importe quel type, y compris char et char*. Dans le même ordre d'idée que ta suggestion, j'ai même pensé utiliser des pointeur void comme champs dans ma structure. J'ai testé et ça marche Cependant, ce qu'on me demande, c'est d'indiquer explicitement le type des champs avec l'appel de le fonction creerTable, c'est types pouvant changer d'un appel à l'autre, dépendant de la forme que l'utilisateur de la fonction veut donner à la table.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 151
    Billets dans le blog
    4
    Par défaut
    Bonsoir,

    pourquoi ne pas imaginer quelque chose comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    #define INT 1
    #define FLOAT 2
    // etc...
    struct Table {
      void* datas;
      int type;
    };
    Table createTable(void* datas, int type, int size)
    {
      Table t;
      t.datas = malloc(size);
      memcpy(t.datas, datas, size);
      t.type = type;
      return t;
    }
    En théorie ça me semble bon, en pratique je demande à voir, je n'ai pas testé le code.
    L'idée est de garder une information sur le type réel pour le cast.
    Bon là il n'y a qu'un seul champ, mais en créer plusieurs ne serait pas plus compliqué.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 532
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 532
    Par défaut
    Salut moi ce que je ferais :
    1 utiliser des listes chainées pour la gestion des données ;une table c'est une sorte de matrice qui va gonfler...
    2 définir un type variant comme le définit Microsoft avec son type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    struct  tagVARIANT
        {
        union 
            {
            struct  __tagVARIANT
                {
                VARTYPE vt;
                WORD wReserved1;
                WORD wReserved2;
                WORD wReserved3;
                union 
                    {
                    LONG lVal;
                    BYTE bVal;
                    SHORT iVal;
                    FLOAT fltVal;
                    DOUBLE dblVal;
                    VARIANT_BOOL boolVal;
                    _VARIANT_BOOL bool;
                    SCODE scode;
                    CY cyVal;
                    DATE date;
                    BSTR bstrVal;
     
                    }	__VARIANT_NAME_3;
                }	__VARIANT_NAME_2;
            DECIMAL decVal;
            }	__VARIANT_NAME_1;
        };
    en voici un morceau tu peux t'inspirer de cela....
    avec un struct { union{}}
    A la place de BSTR il faut définir son type char*
    Donc ainsi pour passer des paramètres il suffit de passer un type Variant au lieu de faire un cast

    3 il faut être masochiste pour faire cela il ya des SGBDR tout fait qui fonctionnenttrès bien

  6. #6
    Membre averti
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 14
    Par défaut
    Si je comprends bien, le but serait de mettre, pour chaque champs de la table, un pointeur void et un entier indiquant le type de la donnée, dans la struct... Et quand serait venu le temps de traiter les données ??? Faire un case sur le variable type et traiter datas en conséquence ??? Mmmmmmmm... j'crois bien que ça pourrait marcher... j'vais devoir tester... Merci

  7. #7
    Membre averti
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 14
    Par défaut
    Mat.M, je suis d'accord avec vous que ce serait plus facile avec un SGBD. Mais bon, le défi qu'on m'a lancé est de le faire de cette manière. Je dis défi car je fais partie de cette génération de programmeurs à qui on a enseigné la programmation orientée objet en C++ sans, malheureusement à mon avis, passer par C. Du coup, je suis un peu perdu sans tous mes beaux objets Hahaha!!

  8. #8
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 532
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 532
    Par défaut
    Citation Envoyé par dré kam Voir le message
    Tu peux déclarer tous les champs comme float ou un autre type très "large" et ensuite faire un cast selon les choix de l'utilisateur.
    d'accord mais avec un float comment vais-je faire pour passer des char* ?

Discussions similaires

  1. création d'une table dans une base de donnée accèss
    Par zidenne dans le forum Bases de données
    Réponses: 1
    Dernier message: 25/10/2005, 10h54
  2. Question sur la création d'une table
    Par air dans le forum Oracle
    Réponses: 4
    Dernier message: 23/10/2005, 12h46
  3. Réponses: 4
    Dernier message: 19/10/2005, 11h26
  4. Création d'une table avec foreign key
    Par lepierre dans le forum Langage SQL
    Réponses: 5
    Dernier message: 17/09/2004, 14h20
  5. INTERBASE Création d'une table
    Par Corben dans le forum InterBase
    Réponses: 2
    Dernier message: 19/06/2004, 20h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo