Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Débutant] Soucis avec les pointeurs

Sujet résolu
    26 mars 2020 à 11:14:51

    Bonjour à tous, 

    Je viens de commencer le cours sur le langage C. Je suis arrivé à la partie sur les pointeurs et la programmation modulaire. 

    J'ai quelques soucis de compréhension sur les pointeurs. Voici mon programme, du moins, le fichier où mes fonctions sont développées : 

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include "pointeur.h"
    
    
    // INITIALISATION DES DONNES -----------------------------------------------------------
    void initialisation_donnees(void)
    {
    	int difficulte = 0 ; // je déclare une valeur de base à ma variable
    
    	int *pt_difficulte = &difficulte ; // je déclare un pointeur qui prend en valeur l'adresse de la variable "difficulté"
    
    	printf("\n------------\nAdresse de la variable difficulte : %p\n", &difficulte); // j'affiche l'adresse de "difficulté"
    
    	printf("Valeur du pointeur : %d\n------------\n\n", *pt_difficulte); // j'affiche la valeur qui est pointée par le pointeur, c'est bien la valeur de "difficulté"
    }
    
    // MENU DIFFICULTE ---------------------------------------------------------------------
    void afficher_menu_difficulte()
    {
    	printf("Choisir difficulte :\nEntre 1 et 100.\nEntre 1 et 200.\nEntre 1 et 300.\n");
    }
    
    // SAISIR DIFFICULTE -------------------------------------------------------------------
    int saisir_difficulte(int *pt_difficulte, int difficulte) 
    {
    	printf("Saisir votre difficulte :"); // je demande à l'utilisateur d'entrer une difficulté
    	scanf("%d", &difficulte); // la difficulté choisie est envoyée à l'adresse de "difficultée"
    
    	printf("\nValeur de la variable que cible le pointeur : %d\n", *pt_difficulte); // il affiche une adresse à la place de la valeur de difficulté
    
    	printf("Valeur de la variable : %d\n", difficulte); // il affiche bien la valeur saisie
    
    	printf("Valeur du pointeur : %p\n", pt_difficulte); // la valeur du pointeur n'est pas la même que l'adresse de ma variable
    
    	printf("Adresse de la variable : %p\n", &difficulte); // 
    }

    -> Alors, le soucis c'est que je ne comprends pas (à moitié en fait), pourquoi mon pointeur ne prend pas la valeur de la difficulté saisie. 

    Le soucis c'est que je n'arrive pas à envoyer en paramètres à la fonction "saisir_difficulte", le pointeur et l'adresse de la variable que j'ai déclaré dans la fonction "initialisation-donnees". Mais quand j'essaye de lui envoyer en mettant : 

    int saisir_difficulte(&difficulte, *pt_difficulte)
    {
    blabla...
    }

    ça ne fonctionne pas... 

    En gros, quand mon programme arrive à : 

    int saisir_difficulte(int *pt_difficulte, int difficulte) 

    Il recréé de nouvelles variables qui sont différentes de celles que j'ai déclaré dans la fonction "initialisation_donnes".

    J'ai compris le problème mais j'ai pas la solution... Comment je peux envoyer la variable et le pointeur de la première fonction, à la seconde ? 

    Merci d'avance ! :)

    • Partager sur Facebook
    • Partager sur Twitter
      26 mars 2020 à 12:42:06

      Salut,

      Il faut bien comprendre que lorsque tu envoies des arguments à une fonction, celle-ci reçoit des copies.

      Lorsque tu entres dans ta fonction saisir_difficulté(), la variable "difficulte" est une AUTRE variable que celle de la fonction appelante et par conséquent, se trouve à une autre adresse que celle pointée par pt_difficulté.

      pt_difficulté contient l'adresse de la variable affectée, donc l'adresse de la variable "difficulte" appartenant à la fonction initialisation_donnee()

      Ensuite, il n'y a vraiment aucun intérêt à envoyer un pointeur sur une variable ET la variable pointée, mais supposons que ce soit pour l'exercice.

      Bonne continuation.

      -
      Edité par drx 26 mars 2020 à 12:42:23

      • Partager sur Facebook
      • Partager sur Twitter

      Bonhomme !! | Jeu de plateforme : Prototype.

        26 mars 2020 à 12:46:26

        Slt je pense que le problème vient du fait que tu ne fais pas d'appel de fonction. Tu crées bien la fonction

        saisir_difficulte tu ne l'appel pas par exemple dans la fonction initialisation_donnees

        • Partager sur Facebook
        • Partager sur Twitter

        Nobody Is Anonyme!!!

          26 mars 2020 à 12:50:48

          Salut @drx, 

          D'accord, j'avais pas bien saisi cette notion. En fait, je peux avoir autant de variable "difficulte" que j'ai de fonctions dans mon programme mais pour autant elles seront toutes différentes (valeur et adresse) ? 

          Pour déclarer une variable et un pointeur qui peuvent être utilisés dans toutes les fonctions de mon programme, je doit les déclarer dans ma fonction main() et ensuite les envoyer en paramètres aux différentes fonctions que j'utilise ? 

          Merci ! 

          NB: oui, je bidouille pour essayer de comprendre...

          ------------------------------

          Salut @BamAss, 

          J'ai bien un appel de cette fonction dans ma fonction main(), elle se trouve juste dans un autre fichier.c :

          #include <stdio.h>
          #include <stdlib.h>
          #include <time.h>
          #include "pointeur.h"
          
          int main (int argc, char *argv [])
          {
          
          initialisation_donnees(); 
          
          afficher_menu_difficulte ();
          
          saisir_difficulte();
          	return 0; 
          }
          

          -
          Edité par ChantaCureau 26 mars 2020 à 12:59:27

          • Partager sur Facebook
          • Partager sur Twitter
            26 mars 2020 à 13:14:47

            Re,

            Tout à fait, je peux avoir 25 fonctions qui contiennent une variable "toto", ce sont 25 variables différentes exclusivement locales aux fonctions.

            Il faut partir du fait qu'une fonction n'a AUCUN moyen d'avoir connaissance de ce qui se passe en dehors* et ne peut manipuler que les variables qui lui sont connues, variables exclusivement locales*. D'où l'intérêt des pointeurs si on veut que cette fonction agisse sur des variables extérieures.

            lorsque l'on écrit :

            int maFonction(int toto)
            {
             ...
            }

            cela revient à déclarer toto de la même manière que si on avait :

            int maFonction()
            {
              int toto = argument envoyé à l'appel de cette fonction;
              ...
            }

            Bonne continuation.

            * Exception faite des variables globales.


            • Partager sur Facebook
            • Partager sur Twitter

            Bonhomme !! | Jeu de plateforme : Prototype.

              26 mars 2020 à 14:13:04

              Ok, c'est déjà plus clair, merci :)

              Il y a juste au niveau de l'envoi des paramètres aux fonctions où j'ai du mal. Par exemple dans ce programme si : 

              #include <stdio.h>
              
              int multiplier_variable_locale(int * pointeursur_variable_locale, int * pointeursur_multiplicateur);
              
              
              int main (void)
              {
              int fonction (){
              	int variable_locale = 40; 
              	int multiplicateur = 0;
              	int resultat = 0; 
              
              	printf("Multiplier la variable locale par x =\n");
              	scanf("%d", &multiplicateur);
              
              	multiplier_variable_locale(&variable_locale, &multiplicateur); 
              
              	printf("Resultat = %d", resultat);
              }
              
              int multiplier_variable_locale(&variable_locale, &multiplicateur)
              {
              	resultat = *pointeursur_variable_locale * *pointeursur_multiplicateur ;
              }
              	return 0; 
              }

              La console me ressort : 

              point.c: In function 'main':
              point.c:21:32: error: expected declaration specifiers or '...' before '&' token
                 21 | int multiplier_variable_locale(&variable_locale, &multiplicateur)
                    |                                ^
              point.c:21:50: error: expected declaration specifiers or '...' before '&' token
                 21 | int multiplier_variable_locale(&variable_locale, &multiplicateur)
                    |

              Alors que pourtant j'ai bien déclaré ces variables dans la fonction main et que je souhaite uniquement envoyer l'adresse de celles-ci à la fonction "multiplier_variable_locale" pour mes pointeurs...

              -
              Edité par ChantaCureau 26 mars 2020 à 14:13:32

              • Partager sur Facebook
              • Partager sur Twitter
                26 mars 2020 à 14:20:51

                Re,

                C'est la définition de ta fonction que ne va pas, ligne 21. le type attendu est int* :

                int multiplier_variable_locale(int* variable_locale, int* multiplicateur)


                Le compilo te dit exactement quelle ligne (21) et ce qui ne va pas, c'est la petite ^ sous le & :

                21 | int multiplier_variable_locale(&variable_locale, &multiplicateur)
                   |                                ^

                Difficile de mieux montrer une erreur.

                -
                Edité par drx 26 mars 2020 à 14:23:08

                • Partager sur Facebook
                • Partager sur Twitter

                Bonhomme !! | Jeu de plateforme : Prototype.

                  26 mars 2020 à 14:31:22

                  Même en changeant le type de la fonction en void, j'ai toujours la même erreur qui ressort : 

                  #include <stdio.h>
                  
                  void multiplier_variable_locale(int* pointeursur_variable_locale, int* pointeursur_multiplicateur);
                  
                  
                  int main (int argc, char *argv[])
                  {
                  
                  	int variable_locale = 40; 
                  	int multiplicateur = 0;
                  	int resultat = 0; 
                  
                  	printf("Multiplier la variable locale par x =\n");
                  	scanf("%d", &multiplicateur);
                  
                  	multiplier_variable_locale(&variable_locale, &multiplicateur); 
                  
                  	printf("Resultat = %d", resultat);
                  
                  	return 0; 
                  }
                  
                  void multiplier_variable_locale(&variable_locale, &multiplicateur)
                  {
                  	resultat = *pointeursur_variable_locale * *pointeursur_multiplicateur ;
                  }



                  • Partager sur Facebook
                  • Partager sur Twitter
                    26 mars 2020 à 15:04:07

                    Re, ligne 23 tu as toujours la même erreur. La définition de ta fonction doit correspondre à sa déclaration.

                    Lis ce que te dit le compilo.

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Bonhomme !! | Jeu de plateforme : Prototype.

                      26 mars 2020 à 15:32:58

                      C'est bon ! 

                      J'avais oublié de déclarer un pointeur et j'avais oublié la petite ligne du cours qui dit que lorsque l'on déclare plusieurs pointeurs sur une même ligne on DOIT mettre l'étoile OBLIGATOIREMENT avant le nom du pointeur.

                      Merci pour tes explications en tout cas. :)

                      • Partager sur Facebook
                      • Partager sur Twitter
                        26 mars 2020 à 22:05:39

                        Bonjour,

                        Sujet résolu

                        Tu peux passer le sujet à "résolu" (bouton en haut à droite du sujet) et cliquer sur les pouces levés des messages qui t'ont aidé⋅e ;)
                        • Partager sur Facebook
                        • Partager sur Twitter

                        [Débutant] Soucis avec les pointeurs

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown