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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
| #include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Produit
{
int idProd;
char libPro[50];
float prixProd;
};
/* Cette fonction remplit une variable de type structure Produit locale a la
fonction et retourne la valeur de cette structure par copie. Si la taille
d'une instance de struct Produit est grand, cette strategie peut causer
des problemes de performance */
struct Produit remplir_produit_1(int id, char const *lib, float prix)
{
struct Produit p = {0, {0}, 0.0};
p.idProd = id;
strncpy(p.libPro, lib, sizeof p.libPro - 1);
p.prixProd = prix;
return p;
}
/* Cette fonction prend un pointeur sur une variable de type structure produit
en parametre et remplit directement la structure situee à l'adresse pointee */
void remplir_produit_2(struct Produit *p, int id, char const *lib, float prix)
{
if (p != NULL)
{
p->idProd = id;
/* Copie securisee de lib dans p->libProd */
p->libPro[0] = '\0';
strncat(p->libPro, lib, sizeof p->libPro - 1);
p->prixProd = prix;
}
}
/* Cette fonction alloue dynamiquement de la memoire dans un espace qui s'appelle
le tas, et l'adresse est placee dans un pointeur p de type pointeur sur struct
Produit. Les champs de la structure pointee par p sont alors remplis et
l'adresse stockee dans p est retournee.
Important: c'est la fonction appelante qui a la responsabilite de liberer la
memoire a l'aide de la fonction free() */
struct Produit *creer_produit(int id, char const *lib, float prix)
{
struct Produit *p = NULL;
p = malloc(sizeof *p);
if (p != NULL)
{
p->idProd = id;
p->libPro[0] = '\0';
strncat(p->libPro, lib, sizeof p->libPro - 1);
p->prixProd = prix;
}
return p;
}
/* Permet d'afficher la representation d'une variable de type struct Produit
sur le flux de sortie standard */
void afficher_produit(struct Produit *p)
{
if (p != NULL)
{
printf("id: %d\n", p->idProd);
printf("lib: %s\n", p->libPro);
printf("prix: %.2f\n", p->prixProd);
printf("\n");
}
}
int main(void)
{
struct Produit p;
struct Produit *q = NULL;
p = remplir_produit_1(1, "sucre, 1 kg", 1.5);
afficher_produit(&p);
remplir_produit_2(&p, 2, "farine, 1 kg", 1.2);
afficher_produit(&p);
q = creer_produit(3, "confiture, 1 pot", 3.5);
if (q != NULL)
{
/* Faire quelque chose avec q */
afficher_produit(q);
/* Libérer la memoire allouee dans creer_produit() */
free(q), q = NULL;
}
else
{
fprintf(stderr, "Allocation de mémoire impossible\n");
}
return EXIT_SUCCESS;
} |
Partager