IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Utilisation de pointeur


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Avril 2014
    Messages : 5
    Points : 0
    Points
    0
    Par défaut Utilisation de pointeur
    Bonjour à tous,
    j'ai besoin de votre aide, je me perds des qu'il y a des pointeurs.
    Je dois écrire un programme qui réalise ces fonctions.
    1. void saisirUneValeur(int *adV)
    2. void puissance (int a,int b, int *c) avec c l'adresse de la variable ou l'on stocke le résultat de a puissance b
    3. int fact(int n,int *c) avec c l'adresse de la variable où l'on stocke le résultat
    4. void afficherUneValeur(int V);



    J'ai écrit ce code mais je pense pas que ça soit le bon parce que j'ai changé les prototypes imposés dans l'exercice.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    #include<stdio.h>
     
    void saisirUneValeur2(int *adV);
    void afficherUneValeur2(int *V);
    int puissance2(int a,int b,int *c);
    void afficherUneValeur1(int V);
     
     
    int main()
    {
        int a,b;
        //int c;
        int z,puis;
        int x;
        //int *p=&x;
        saisirUneValeur2(&x);
        //printf("la valeur est = %d \n",x);
        afficherUneValeur2(&x);
     
        printf("Entrer first valeur \n");
        scanf("%d",&a);
     
        printf("Entrer second valeur \n");
        scanf("%d",&b);
     
        puis=puissance2(a,b,&z);
        afficherUneValeur1(puis);
        //printf("La puissance est %d \n",puis);
     
        return 0;
    }
     
     
    void saisirUneValeur2(int *adV)
    {
        int n;
        adV=&n;
        printf("Entrer une valeur \n");
        scanf("%d",&n);
    }
     
     
    void afficherUneValeur1(int V)
    {
        printf("la valeur est %d \n",V);
    }
     
    void afficherUneValeur2(int *V)
    {
        int n;
        V=&n;
        printf("la valeur est %d \n",n);
    }
     
     
    int puissance2(int a,int b,int *c)
    {
        int p,i;
        c=&p;
        p=1;
        for(i=1;i<=b;i++)
            p=p*a;
        //printf("La puissance est %d \n",p);
        return p;
    }
    MERCI d'AVANCE

  2. #2
    Membre actif

    Homme Profil pro
    autodidacte
    Inscrit en
    Mars 2011
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : autodidacte

    Informations forums :
    Inscription : Mars 2011
    Messages : 95
    Points : 207
    Points
    207
    Par défaut
    1) Pour déclarer un pointeur sur un int, on utilise "*". La variable en question est alors l'adresse d'une variable entière.
    2) en dehors d'une déclaration donc, pour accéder à ladite variable entière, on utilise l'opérateur d'indirection "*"

    En résumé, entre les parenthèses d'une fonction, le "*" indique une déclaration. Après les parenthèses, c'est une indirection.

    Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int main()
    {
        int *pEntier;             /*pointeur sur un entier*/
        *pEntier=4;        /* affectation de 4 à l'entier sur lequel pEntier pointe*/
        scanf("%d",pEntier);    /*pEntier est une adresse, on peut l'utiliser tel quel dans scanf*/
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void saisirUneValeur2(int *adV)
    {
        printf("Entrer une valeur \n");
        scanf("%d",adv);
    }
    Toujours à adapter le problème à la structure de la machine, mais se soigne pour faire l'inverse.

  3. #3
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Bonsoir.

    Pense à encadrer ton code source avec les balises.

    Ceci étant prenons la fonction suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void afficherUneValeur2(int *V)
    {
        int n;
        V=&n;
        printf("la valeur est %d \n",n);
    }
    *V signifie l'adresse où est stockée la valeur de V.

    Lorsque tu écris V=&n tu demandes à changer l'adresse de V par l'adresse de n. Tu perds donc l'adresse de départ transmise.

    La variable n ne sert à rien ici. Tu peux donc aller à l'essentiel en affichant directement V.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void afficherUneValeur2(int *V)
    {
        printf("la valeur est %d \n",*V);
    }
    *V demande de ne pas accéder à l'adresse de V mais directement à son contenu.

    Tu peux appliquer ceci aux autres fonctions de ton programme.

  4. #4
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Avril 2014
    Messages : 5
    Points : 0
    Points
    0
    Par défaut
    Merci pour vos réponses

    j'ai corrigé mes fonctions de saisie et d'affiche et ça me donne ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #include<stdio.h>
    int main()
    {
        int x;
        saisirUneValeur(&x);
        afficherUneValeur(x);
        return 0;
    }
     
    void saisirUneValeur(int *V)
    {
        printf("Entrer une valeur \n");
        scanf("%d",V);
    }
     
    void afficherUneValeur(int V)
    {
        printf("La valeur est %d \n",V);
    }

    J'ai respecté les prototypes imposés par l'exercice.
    Mais pour la fonction puissance comment faire pour stocker le résultat dans un pointeur et
    non dans une variable de type int simplement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void puissance(int a,int b, int *c)
    {
        int i;
        *c=1;
        for(i=1;i<=b;i++)
            *c=*c*a;
        printf("La puissance est ..")
    je sais pas comment faire pour mettre le resultat de la puissance dans une variable
    en passant par son adresse et comment l'afficher!
    Merci D'avance

  5. #5
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Août 2008
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Août 2008
    Messages : 282
    Points : 939
    Points
    939
    Par défaut
    Bonjour,

    Si tu écris "a" ou "b", tu manipules la variable a ou b.
    Si tu écris "*c", tu manipules la variable qui "pointée" par c.
    Penses pointeur comme n° du casier de consigne où se trouve ma donnée.

    Tu n'utilises pas de variable locale pendant le calcul de la factorielle, tu travailles déjà avec ta variable "au loin" car tu écris *c. D'ailleurs, pour une meilleure lisibilité, je te conseillerai d'écrire *c = (*c) * a. Quand tu as fini ta fonction, c est donc déjà à jour.

    Tu pourrais (bonne pratique) utiliser une variable locale, par exemple "int puissance;" et remplacer *c par puissance dans ton code. Et juste à la fin, tu envoie la valeur de ta variable dans le c qui est au loin par *c = puissance.

    Pour afficher la puissance avec *c dans ta fonction, la réponse est dans le message de gerald3d.
    Mais je pense que ton prof pensai afficher la puissance une fois de retour dans le code qui a appelé ta fonction ?
    poke 1024,0; poke 214,214

  6. #6
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par safgh Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void puissance(int a,int b, int *c)
    {
        int i;
        *c=1;
        for(i=1;i<=b;i++)
            *c=*c*a;
        printf("La puissance est ..")
    En C la lettre "*" exprime deux possibilités :
    • *c : contenu de l'adresse c
    • c*a : multiplication de cxa

    Pour éviter au compilateur une mauvaise interprétation de ce genre d'écriture (*c=*c*a) tu devrais déclarer une variable locale que tu utiliseras pour recueillir le résultat de la puissance.
    Une fois fait il te suffira d'affecter cette valeur au contenu de l'adresse de c (*c).

  7. #7
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Avril 2014
    Messages : 5
    Points : 0
    Points
    0
    Par défaut
    Merci pour vos explications

    j'ai corrigé ma fonction puissance

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void puissance(int a,int b,int *c)
    {
    int i,p;
    *c=p;
    p=1;
    for(i=1;i<b;i++)
    p=p*a;
    printf("La puissance est %d \n",p);
    }
    et dans le main je fais cet appel

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int main()
    {
    int a,b,z;
    printf("Entrer  une premiere valeur \n");
    scanf("%d",&a);
     
    printf("Entrer  une deuxieme valeur \n");
    scanf("%d",&b);
     puissance(a,b,&z);
    return 0;
    }

  8. #8
    Invité
    Invité(e)
    Par défaut
    ( Pense à indenter ton code )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void puissance(int a,int b,int *c)
    {
        int i,p;
    
        *c=p; // ATTENTION
        p=1;
    
        for(i=1;i<b;i++)
            p=p*a;
    
        *c = p; // Le bon endroit   
    
        printf("La puissance est %d \n",p);
    }
    Fais attention...
    Tu demandes d'assigner, à l'adresse de c, le contenu de p, alors que tu n'a ni initialisé, ni effectué aucun traitement dessus.
    Ne pas oublier que le langage C est procédurale, il effectue chaque actions l'une à la suite de l'autre. Selon ce que tu fais, la valeur contenu dans *c sera la valeur de p pré-traitement. Pour bien faire, il fait faire l'assignation une fois le traitement effectué.


    Concernant l'affichage, dans la fonction puissance(), tu effectues l'affichage de la variable p.
    Une fois revenu dans le main, tu devrais effectué l'affichage de ta variable z pour vérifier qu'elle ai bien reçu le résultat de la puissance.


    ( et au passage, petite remarque d'ordre sémantique : pense à donner un nom explicite à tes variables : a -> nbr1, b -> nbr2, z -> resPuissance, ... Dans un petit projet, cela ne pose pas de soucis, mais quand ça deviens plus ample, cela aide grandement à la relecture.)

  9. #9
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Avril 2014
    Messages : 5
    Points : 0
    Points
    0
    Par défaut
    Merci pour vos réponses et vos remarques.
    J'ai écrit la fonction factorielle mais on m'affiche un message d'erreur et je comprends pas pourquoi.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void fact(int n,int *c)
    {
    int f;
     
    if(n>1)
    f=fact(n-1,&f)*n;
    else
    f=1;
     
    *c=f;
    printf("la fact est egale a %d\n",f);
    }

  10. #10
    Invité
    Invité(e)
    Par défaut
    Je vais le redire, pas être parenthèse cette fois, et en plus gros et visible : Pense à indenter ton code !
    Il s'agit là du moindre des respects envers les personnes voulant éventuellement t'aider que de mettre en leurs mains quelque chose de lisible, avec toute les informations nécessaire à la compréhension du problème. Simplement un "ça marche pas", avec un bout de code, sans même préciser le type ou la nature de l'erreur... Un peu de jugeote, bon sang !

    Donc, pour parler du code proprement dit, en le compilant, il y a un message d'erreur qui me semble assez explicite !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    te.c: In function ‘fact’:
    te.c:8:1: error: void value not ignored as it ought to be
    On touche du doigt le principe d'une fonction, là.
    Tu déclares une fonction fact() qui a un type de retour void, c'est à dire que la fonction tel que actuellement écrite ne renvois aucune valeur.
    Or dans ton code, f=fact(n-1,&f)*n; équivaut à dire "j'assigne à f la multiplication de n par rien". Il y a comme un problème dans l'énoncé, tu ne trouves pas ?

    J'ajoute que cette erreur, tu aurais déjà pu y répondre seul, en relisant ton cours/un tutoriel/googlant sans avoir besoin de passer directement par ici.

    Ensuite, utiliser la récursivité pour résoudre une factoriel est en soi une très bonne idée.
    Mais pour faire quelque chose de correct, il faut connaitre les principes de base de la récursivité. Et sans être méchant ou quoi que ce soit avec toi, il ne me semble pas que ce soit cas dans ce que je lis.

    Avez-vous déjà vu la récursivité ? Connaissez-vous comment l'appliqué ?
    Si c'est le cas, relis ton cours, et si tu as des questions, on est là pour t'écouter.

    Si ce n'est pas le cas, il y a la méthode "simple" de résolution de factoriel, à base de boucle, qui est plus simple à mettre en oeuvre.

    A partir de cela, je te propose de faire les modifications qui s'impose et de revenir vers nous avec des éventuels questions précise, et pas seulement un "ça marche pas".

  11. #11
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Avril 2014
    Messages : 5
    Points : 0
    Points
    0
    Par défaut
    Merci pour vous conseils, je prendrais vos remarques en compte la prochaine fois.

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 631
    Points : 10 559
    Points
    10 559
    Par défaut
    Citation Envoyé par archMqx. Voir le message
    Tu déclares une fonction fact() qui a un type de retour void
    Pour être précis , fact est une procédure non pas une fonction

Discussions similaires

  1. Réponses: 14
    Dernier message: 22/04/2006, 21h59
  2. Optimiser l'utilisation des pointeurs
    Par progfou dans le forum C
    Réponses: 65
    Dernier message: 10/03/2006, 11h49
  3. Réponses: 6
    Dernier message: 21/02/2006, 16h47
  4. Utilisation de pointeurs
    Par renard s dans le forum Débuter
    Réponses: 7
    Dernier message: 08/12/2005, 08h18
  5. Utilisation de Pointeurs dans API windows
    Par Drooxy dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 13/03/2003, 22h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo