C : passage de pointeur en parametre

remibarbier Messages postés 259 Statut Membre -  
remibarbier Messages postés 259 Statut Membre -
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 11653 Statut Contributeur 1 847
 
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
lami20j
 
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 11653 Statut Contributeur 1 847
 
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 3447 Statut Contributeur 854
 
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 259 Statut Membre 16
 
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 259 Statut Membre 16
 
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 259 Statut Membre 16
 
RE,
Génial, merci c'est exactement ce qui me fallait pour bien comprendre !
merci beaucoup
0