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 :

fonction (générique) malloc sur structure?


Sujet :

C

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 54
    Points : 32
    Points
    32
    Par défaut fonction (générique) malloc sur structure?
    Bonjour,

    Je cherche a faire une fonction pour exécuter un malloc sur différents types de structures.

    Dans mon code, j'ai des malloc a faire sur de nombreuses structures de types différents, et pour "gagner du temps", je me suis dis que ca serais sympas de faire une fonction a laquelle je pourrais passer la structure en paramètre, faire mon malloc et retourner la structure.

    La ou je suis bloqué, c'est que je suis, a ma connaissance, obligé de passer le type de la structure un peu partout..



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct str
    {
    	char *string;
    }t_str
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    t_str* new_struct(void);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    t_str* new_struct()
    {
    	t_str* this = malloc(sizeof(t_str));
    	if (!this) return NULL;
    	return this;
    }

    Y aurait il un moyen (détourner?) de faire qui me permettrais de réutiliser la fonction pour n'importe quelle type de structure???

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Dunkhan Voir le message
    Y aurait il un moyen (détourné?) de faire qui me permettrais de réutiliser la fonction pour n'importe quelle type de structure???
    Hum...en passant par un void* qui sert justement à uniformiser des pointeurs disparates...

    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
    typedef struct {
    	char tab[10];
    }t_strA;
     
    typedef struct {
    	char tab[20];
    }t_strB;
     
    void *allocate(size_t n) {
        void *this;
        this=malloc(n);
        return this;
    }
     
    t_strA *ptA;
    t_strB *ptB;
    ptA=(t_strA*)allocate(sizeof(*ptA));
    ptB=(t_strB*)allocate(sizeof(*ptB));
    Mais tu remarqueras assez vite (j'espère) que cette façon de faire rend alors cette fonction totalement inutile...
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    t_strA *ptA;
    t_strB *ptB;
    ptA=malloc(sizeof(*ptA));
    ptB=malloc(sizeof(*ptB));
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 54
    Points : 32
    Points
    32
    Par défaut
    Pq c'est plus rapide de l’écrire directement de que passer par une fonction??
    Et qu'aussi, il faudra que je passe la taille de la structure en paramètre (donc une ligne de code en plus pour la connaitre et l'affecter a une variable).

    Mais je suis censé faire un gestionnaire d'erreurs qui capture toutes les interactions qui sont supposées "possible" d'en provoquer.

    Du coups, je pensais inclure mon gestionnaire d'erreurs dans la fonction new_struct()


    Merci pour la réponse

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Dunkhan Voir le message
    Pq c'est plus rapide de l’écrire directement de que passer par une fonction??
    Attention, je n'ai pas dit de ne pas passer par une fonction. Mais malloc() c'est déjà une fonction et elle est faite justement pour ça. Et, si tu regardes bien, ta fonction (tout comme la miennne d'ailleurs) ne font rien de plus et peuvent même se simplifier
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    t_str* new_struct() {
    	return malloc(sizeof(t_str));
    }
     
    void *allocate(size_t n) {
    	return malloc(n);
    }

    Donc passer par une seconde fonction qui (pour l'instant) ne fait rien de plus que malloc, ça ne sert à rien.

    Citation Envoyé par Dunkhan Voir le message
    Et qu'aussi, il faudra que je passe la taille de la structure en paramètre (donc une ligne de code en plus pour la connaitre et l'affecter a une variable).
    Ah ben ça reste incontournable. Soit ta fonction est du type "pointeur sur structure" et donc elle connait implicitement la taille de ladite structure, soit elle est de type "pointeur universel" et comme elle ne connait plus la taille de la structure il faut la lui passer à un moment ou à un autre...

    Citation Envoyé par Dunkhan Voir le message
    Mais je suis censé faire une gestionnaire d'erreurs qui capturent toutes les interactions qui sont supposées "possible" d'en provoquer
    Du coups, je pensais inclure mon gestionnaire d'erreurs dans la fonction new_struct()
    Ok. A ce moment là, effectivement la fonction commence à avoir un sens et une utilité. Mais si tu veux "une seule fonction universelle" tu es obligé de travailler en "universel" donc en "void *". Et là tu peux y inclure ton gestionnaire d'erreurs. Mais tu ne pourras pas éviter d'avoir à lui passer la taille de la structure en paramètre. On n'a rien sans rien et ça reste valable en informatique aussi
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 54
    Points : 32
    Points
    32
    Par défaut
    Ok, merci pour les précisions..
    J'avais pensé proposer le type générique void*, mais c'est qlq chose que l'on vient de juste voir au cours et je n'ai pas encore compris toute l’étendue des possibilités..

  6. #6
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Le C n'offre qu'un éventail de possibilités très limité / contraignant pour faire de la généricité. On peut le résumer à :

    • void * à l'exécution :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      typedef struct vector {
          size_t capacity,
                 count, // element count
                 size;  // element size
          void *data;
      } vector_t;
    • les macros à la compilation :
      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
      #define CONCAT_(a, b) a ## b
      #define CONCAT(a, b) CONCAT_(a, b)
       
      /* ... */
       
      #define TYPEDEF_VECTOR(type, suffix) \
      typedef struct CONCAT(vector_, suffix) { \
          size_t capacity,                   \
                 count; /* element count */  \
          type *data;                         \
      } CONCAT(CONCAT(vector_, suffix), _t);
       
       
      TYPEDEF_VECTOR(double, double)
      TYPEDEF_VECTOR(unsigned long, ulong)
       
       
      int main(int argc, char *argv[]) {
          vector_double_t v0;
          vector_ulong_t v1;
       
          // ...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de malloc sur structures.
    Par Mornor dans le forum Débuter
    Réponses: 8
    Dernier message: 09/05/2013, 18h01
  2. Réponses: 3
    Dernier message: 05/08/2009, 09h23
  3. Réponses: 9
    Dernier message: 24/12/2008, 09h21
  4. Réponses: 10
    Dernier message: 03/02/2005, 13h09
  5. ma fonction marche plus sur le serveur...
    Par CDRIK dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 18/10/2004, 04h24

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