Partage
  • Partager sur Facebook
  • Partager sur Twitter

Comment utiliser un struct ?

    21 octobre 2019 à 18:02:55

    Bonsoir,

    Je n'utilise peut-être pas la bonne manière d'initialiser un 'struct' à la ligne 14, il y a moyen de faire plus simple ?

    Par exemple, est-il possible de résumer les lignes 14, 15 et 16 en une seule instruction ?

    #include <stdlib.h>
    
    typedef struct Player
    {
    	int id;
    	int points;         // points de son dernier match
    	float total_score;
    
    } player;
    
    player* new_player(int id)
    {
    	player* p = (player*) malloc(sizeof(player));
    	p->id = id;
    	p->points = 0;
    	p->total_score = 0;
    
    	return p;
    }
    
    int main(void)
    {
    	player* Alice = new_player(45);
    	
    	// ...
    	
    	free(Alice);
    	return 0;
    }



    • Partager sur Facebook
    • Partager sur Twitter
      21 octobre 2019 à 18:11:56

      La méthode est correcte. Tu aurais pu éventuellement utiliser calloc qui initialise le bloc mémoire à 0.
      • Partager sur Facebook
      • Partager sur Twitter
        22 octobre 2019 à 14:17:29

        Note : inutile de transtyper le retour de malloc en C.
        • Partager sur Facebook
        • Partager sur Twitter

        git is great because Linus did it, mercurial is better because he didn't.

          22 octobre 2019 à 14:37:14

          Variantes, depuis C99

          player* new_player(int id)
          {
              player* p = malloc(sizeof(player));
              *p = (player) { id, 0, 0 };
              return p;
          }
          

          ou

          player* new_player(int id)
          {
              player* p = malloc(sizeof(player));
              *p = (player) {.id = id };
           
              return p;
          }


          (designated initializers,  - les champs non mentionnés sont initialisés à 0 pour les entiers, NULL pour les pointeurs etc. C11 6.7.9/10)

          Le compilateur, qui n'est pas la moitié d'un idiot pour peu qu'on lui demande gentiment d'optimiser, ne fabrique évidemment pas un "player" intermédiaire pour le copier ensuite.

          -
          Edité par michelbillaud 22 octobre 2019 à 14:48:30

          • Partager sur Facebook
          • Partager sur Twitter
            22 octobre 2019 à 16:01:03

            Bonjour,

            Ta fonction peut aussi retourner une simple copie

            player new_player(int id)
            {
              return (player){id, 0, 0};
            }
            
            int main(void)
            {
              player Alice = new_player(45);
            
              //...
            
              return 0;
            }



            • Partager sur Facebook
            • Partager sur Twitter

            Comment utiliser un struct ?

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown