#1 Le 02/03/2017, à 11: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, à 16:48)
Hors ligne
#2 Le 02/03/2017, à 12: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);
Ce compte ne servira plus : vous pouvez le supprimer si le coeur vous en dit...
Laissé par l'auteur pour historique.
Hors ligne
#3 Le 02/03/2017, à 12: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, à 12:44)
Hors ligne
#4 Le 03/03/2017, à 09:55
- pingouinux
Re : A comprends pas un programme en C [RESOLU]
Bonjour,
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, à 10: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, à 10:11)
Hors ligne
#6 Le 03/03/2017, à 13: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, à 14: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, à 14:33)
Hors ligne
#8 Le 03/03/2017, à 18:02
- pingouinux
Re : A comprends pas un programme en C [RESOLU]
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; }
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, à 16: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