Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 02/03/2017, à 12:58

plouf1221

A comprends pas un programme en C [RESOLU]

Bonjour,

Je cherchais comment renvoyé plusieur valeur dans une fonction.
L'astuce consiste à passer par un pointeur de structure, comme ca on a comme info tous les champs de la struture.
J'ai trouvé sur le net mais je ne comprends rien.

Le code :

#include <stdlib.h>                                                                                                                                                                                                 
 #include <stdio.h>
 #include <assert.h>
 
 int main (void) {
 
     typedef struct {
         int q;
         int r;
     } division;
 
     division objet;
 
     // FONCTION :
     // - créer       une strucutre
     // - initialiser une strucutre
     // - retourne pointeur sur cette strucutre
     // Ce mécanisme permet à une fonction de renvoyer plusieurs valeurs !!!
 
     division* divi (int a, int b) {
 
         /* Déclaration d'un pointeur de structure */
         division* p;
 
         /* Allocation mémoire de la structure sous condition*/
         assert (b != 0); 
         if (NULL == (p = malloc (sizeof *p)))
             return (NULL);
         p -> q = a/b; // comment le pointeur peut taper sur q sans avoir au préalable donner la ref de structure
         p -> r = a%b;
 
         /* retourne le pointeur vers la structure ainsi crée */
         return (p);
     }   
 
     division* r;
     r = divi (10, 3); 
 
     printf ("Le quotient est : %d.Le reste est : %d.\n", r -> q, r -> r); 
     printf ("Le quotient est : %d.Le reste est : %d.\n", objet.q, objet.r);
 
     return EXIT_SUCCESS;
 }

Comment le pointeur peut avec accès à p et a q alors que le pointeur n'est pas référencé ?

Dernière modification par plouf1221 (Le 04/03/2017, à 17:48)

Hors ligne

#2 Le 02/03/2017, à 13:15

jplemoine

Re : A comprends pas un programme en C [RESOLU]

En fait, c'est "mal" écrit (il y a 2 fois r et l'on peut alors confondre les 2)

     division* toto;  --> toto est alors un pointeur sur la structure.
     toto = divi (10, 3); --> toto est alors le pointeur sur la structure renseignée.
 
     printf ("Le quotient est : %d.Le reste est : %d.\n", toto -> q, toto -> r); 

Cette ligne reste mystérieuse pour moi (C'est peut être du C type Visual C ou C++)

     printf ("Le quotient est : %d.Le reste est : %d.\n", objet.q, objet.r);

Membre de l'ALDIL (Association Lyonnaise pour le Développement de l'Informatique Libre)
- En pro, après 20 ans de développement, administrateur Linux / Unix depuis Avril 2019.
- En privé, sous Ubuntu-Xubuntu depuis 2009.

Hors ligne

#3 Le 02/03/2017, à 13:42

plouf1221

Re : A comprends pas un programme en C [RESOLU]

Ce n'est que du C Jean-Philippe.

[code] division* toto;  --> toto ne pointe sur rien c'est juste la déclaration d'un pointeur sans reference 
     toto = divi (10, 3); --> toto est alors le pointeur sur la structure renseignée. Mais quelle structure ?
                            Ici c'est une fonction qui retourne un pointeur. Et ce pointeur n'est pas referencé[/code]
 
     printf ("Le quotient est : %d.Le reste est : %d.\n", toto -> q, toto -> r); 

Dernière modification par plouf1221 (Le 02/03/2017, à 13:44)

Hors ligne

#4 Le 03/03/2017, à 10:55

pingouinux

Re : A comprends pas un programme en C [RESOLU]

Bonjour,

plouf1221 a écrit :

Comment le pointeur peut avec accès à p et a q alors que le pointeur n'est pas référencé ?

Dans divi, tu déclares

         division* p;

et division est défini dans le typedef au-dessus.

Si tu veux que objet soit initialisé, tu peux faire

     r = divi (10, 3);
     objet = *r;

ou

     objet = *divi(10,3);

L'inconvénient est que chaque appel à divi va allouer une nouvelle zone de mémoire, qu'il faudra désallouer toi-même.

Pour éviter ce problème d'allocation, tu peux faire ceci :

     void divi2 (int a, int b, division* p) {
         assert (b != 0); 
         p -> q = a/b; 
         p -> r = a%b;
     }
     divi2 (17, 3, &objet);
     printf ("Le quotient est : %d.Le reste est : %d.\n", objet.q, objet.r);

Hors ligne

#5 Le 03/03/2017, à 11:05

plouf1221

Re : A comprends pas un programme en C [RESOLU]

Je me suis mal exprimé.
Ce que je ne comprends pas c'est ca

   // Déclaration d'une structure nomée coordonnée                                                                                                                                                                 
     struct coordonnee
     {   
         char *nom;
         int x;
         int y;
     };  
 
     // Déclaration d'un objet de type coordonnée
     struct coordonnee point;

// pointeur
struct coordonnee *p;
p = &point; // mon pointeur est REFERENCE ICI

=============================================
Maintenant j'utilise l’opérateur typedef

int main (void) {
                                                                                                                                                                                                                     
     typedef struct _division {
         int q;
         int r;
     } division;
 
     division* divi (int a, int b) {
 
         /* Déclaration d'un pointeur de struture */
         division *p; 
 
         /* Allocation dynamique d'un pointeur */
         assert (b != 0); 
         if (NULL == (p = malloc (sizeof *p)))
             return (NULL);
 
         p -> q = a/b; // je ne comprends pas comment le pointeur p arrive à
         p -> r = a%b; // saisir les champs de la struture division ou du type division alors qu'a aucun moment ce pointeur est référencé.
         return p;
     }   

On ne peux même pas faire la chose suivante et je sais toujours pas pourquoi :
printf ("'%d", division.q);

Dernière modification par plouf1221 (Le 03/03/2017, à 11:11)

Hors ligne

#6 Le 03/03/2017, à 14:37

pingouinux

Re : A comprends pas un programme en C [RESOLU]

On ne peux même pas faire la chose suivante et je sais toujours pas pourquoi :
printf ("'%d", division.q);

Tu as défini (avec typedef) un nouveau type de variable (type division). Tu ne peux pas l'utiliser comme une variable.
Tu ne pourrais pas non  plus faire ceci :

printf ("'%d", int);

Hors ligne

#7 Le 03/03/2017, à 15:31

plouf1221

Re : A comprends pas un programme en C [RESOLU]

Merci Monsieur pingouinux, pour tous ces précieux conseils.
Je comprends pourquoi on ne peut faire le printf dessus effectivement vu comme çà c'est bête.

Mais avec typedef y a pas de référencement, alors comment le pointeur c'est ou il doit aller
car division *p ne référence pas le pointeur c'est comme écrire int *p.
C'est cela que je ne comprends pas.

Et le pire c'est que çà marche !

Dernière modification par plouf1221 (Le 03/03/2017, à 15:33)

Hors ligne

#8 Le 03/03/2017, à 19:02

pingouinux

Re : A comprends pas un programme en C [RESOLU]

plouf1221 #5 a écrit :
     division* divi (int a, int b) {
 
         /* Déclaration d'un pointeur de struture */
         division *p; 
 
         /* Allocation dynamique d'un pointeur */
         assert (b != 0); 
         if (NULL == (p = malloc (sizeof *p)))
             return (NULL);
 
         p -> q = a/b; // je ne comprends pas comment le pointeur p arrive à
         p -> r = a%b; // saisir les champs de la struture division ou du type division alors qu'a aucun moment ce pointeur est référencé.
         return p;
     }
plouf1221 #7 a écrit :

Mais avec typedef y a pas de référencement, alors comment le pointeur c'est ou il doit aller
car division *p ne référence pas le pointeur c'est comme écrire int *p.

Je ne comprends pas ce que tu ne comprends pas…
division *p; : Tu définis la variable p qui est un pointeur sur le type division.
p = malloc (sizeof *p) : Tu alloues de la mémoire à ce pointeur
p -> q = a/b;
p -> r = a%b;
: Tu utilises ce pointeur pour accéder aux éléments de la structure
return p; : Tu renvoies le pointeur au programme appelant

Hors ligne

#9 Le 04/03/2017, à 17:48

plouf1221

Re : A comprends pas un programme en C [RESOLU]

On va dire que le sujet est résolu même si je n'en suis pas convaincu.
Merci pour votre temps et vos explications.

Hors ligne