C : passage de pointeur en parametre

Fermé
remibarbier Messages postés 237 Date d'inscription lundi 21 avril 2008 Statut Membre Dernière intervention 30 mai 2013 - 19 déc. 2009 à 18:41
remibarbier Messages postés 237 Date d'inscription lundi 21 avril 2008 Statut Membre Dernière intervention 30 mai 2013 - 19 déc. 2009 à 22:54
Bonjour,

comment modifieriez vous le code C ci-dessous pour qui marche : c'est pour comprendre le passage de pointeur en paramètre que j'ai du mal à comprendre, cardans le "return" on peut mettre qu'une chose

ps : on ma dit que "scanf" et "printf" c'est pas top, il y a bien "fgets" mais apparemment ca marche que pour les "char" comment ferriez vous ?


#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>

void variable(double *conductivite,double *masse_vol)
{
printf("quelle conductivite");

scanf("%lf",conductivite);

printf("quelle masse molaire");

scanf("%lf",masse_vol);

}

int main()
{
double *conductivite;
double *masse_vol;

variable(conductivite,masse_vol);

printf("%lf",conductivite);
printf("%lf",masse_vol);
}

merci

7 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 841
19 déc. 2009 à 19:16
Salut,

Lorsque tu affiches tes variables, tu affiches en fait les adresses des pointeurs.
Il faut donc rajouter des étoiles devant. Cela va aller pointer sur l'adresse mémoire. De plus quand tu affiches des double, il faut utiliser juste f et non lf.
printf("%f",*conductivite);
printf("%f",*masse_vol); 

Et enfin n'oublie pas de mettre return 0; avant la fin de ton accolade finale.
A moins d'être en C99...

Cdlt
1
Salut,

Ta fonction a comme paramètres deux pointeurs.
Alors il faut passer en argument les adresses de deux variables.

#include<stdio.h>
#include<stdlib.h>

void variable(double *conductivite,double *masse_vol)
{
  printf("quelle conductivite : ");
  scanf("%lf",conductivite);

  printf("quelle masse molaire : ");
  scanf("%lf",masse_vol);

}

int main()
{
  double conductivite;
  double masse_vol;

  variable(&conductivite,&masse_vol);

  printf("%f ",conductivite);
  printf("%f\n",masse_vol);
  return 0;
}


Compilation et résultat

lami20j@debian:~$ gcc -Wall a.c
lami20j@debian:~$ ./a.out
quelle conductivite : 10
quelle masse molaire : 20
10.000000 20.000000
lami20j@debian:~$
1
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 841
19 déc. 2009 à 21:46
Salut,
Si tu veux utiliser les pointeurs, faut réaliser de l'allocation.
Voici un exemple :

#include <stdio.h>
#include <stdlib.h>

void variable(double *conductivite, double *masse_vol) {
    printf("quelle conductivite : ");
    scanf("%lf",conductivite);

    printf("quelle masse molaire : ");
    scanf("%lf",masse_vol);

}

int main(void) {
    double *conductivite;
    double *masse_vol;
    
    conductivite=malloc(sizeof (double));
    masse_vol=malloc(sizeof (double));

    if(conductivite==NULL || masse_vol==NULL) {
        fputs("erreur d'allocation\n",stderr);
        return EXIT_FAILURE;
    }

    variable(conductivite,masse_vol);

    printf("%f",*conductivite);
    printf("%f\n",*masse_vol);

    free(conductivite),conductivite=NULL;
    free(masse_vol),masse_vol=NULL;

    return 0;
}

Et j'insiste bien, il faut utiliser printf("%f") et non printf("%lf"). Pour le scanf par contre, il faut laisser bien évidemment scanf("%lf").
1
Dora The Explorer Messages postés 2811 Date d'inscription mardi 4 septembre 2007 Statut Contributeur Dernière intervention 1 septembre 2011 853
19 déc. 2009 à 19:35
Salut !

Si je ne dis pas de connerie...:
Un pointeur, comme son nom l'indique, permet de pointer sur une autre variable. Le pointeur en lui même contient une adresse de variable.

Il faudrait donc créer deux variables, et deux pointeurs qui pointent sur ces variables, c'est-à-dire qui contiennent l'adresse de ces variables.

Ensuite tu fais comme tu as déjà fait, tu envoies les pointeurs à la fonction, etc. Sauf pour l'affichage comme l'a dit fiddy.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
remibarbier Messages postés 237 Date d'inscription lundi 21 avril 2008 Statut Membre Dernière intervention 30 mai 2013 16
19 déc. 2009 à 20:34
RE
pourtant quand je compile avec gcc j'ai ce problème :
(en rectifiant comme vous avez dit)
gcc eau1.c -lm -o eau1

eau1.c: In function ‘variable’:
eau1.c:9: attention : format ‘%f’ expects type ‘float *’, but argument 2 has type ‘int’
eau1.c:11: attention : format ‘%f’ expects type ‘float *’, but argument 2 has type ‘int’

eau1.c: In function ‘main’:
eau1.c:31: attention : passing argument 1 of ‘variable’ from incompatible pointer type
eau1.c:31: attention : passing argument 2 of ‘variable’ from incompatible pointer type
0
remibarbier Messages postés 237 Date d'inscription lundi 21 avril 2008 Statut Membre Dernière intervention 30 mai 2013 16
19 déc. 2009 à 20:49
Cela marche merci beaucoup lami20j,
j'ai bien %lf car %f ne fonctionne pas.

Et si je commencer le main avec :

int main()
{
double *conductivite;

N'y aurrait-il pas moyen que ça marche quand même ?
0
remibarbier Messages postés 237 Date d'inscription lundi 21 avril 2008 Statut Membre Dernière intervention 30 mai 2013 16
19 déc. 2009 à 22:54
RE,
Génial, merci c'est exactement ce qui me fallait pour bien comprendre !
merci beaucoup
0