Partage
  • Partager sur Facebook
  • Partager sur Twitter

[tableau] et pointeur !!

probleme dans le passage d'argument de fonction

Sujet résolu
    8 mars 2006 à 16:39:11

    Bonjour , et avant de vous demander de l'aide , je vous montre mon code !

    int nbrMotDico()
    {
        FILE* fichier = NULL;
        int nbr = 0;
        char varchar = 0;
        fichier = fopen("dico.txt""r");
        while(varchar != EOF)
        {
            varchar = fgetc(fichier);
            if(varchar == '\n')
            {
                nbr++;
            }
        }
        fclose(fichier);
        return nbr+1;
    }
    long nombreAleatoire(long nombreMax)
    {
        srand(time(NULL));
        return (rand() % nombreMax);
    }
    void setMotSecret(char* mot)
    {
        long random = nombreAleatoire(nbrMotDico());
        mot = "bienvenue";
    }


    int main(int argc‚ char *argv[])
    {
        char lettre = 0; // Stocke la lettre proposée par l'utilisateur (retour du scanf)
        char secret[100] = {0}; // C'est le mot à trouver
        setMotSecret(secret);
        printf("%s"‚secret[1]);   
        system("PAUSE");   
        return 0;
    }

    Alors , pour les débutants je recommence , les fonctions au dessus de main() ne sont pas important , c'est setMotSecret qui m'importe !
    En fait cette fonction fais appel aux deux autres et dois normalement modifier le pointeur passé en parametre ! ICI => un tableau
    Cependant dans le main , lorsque j'affiche la variable qui est sensée etre modifiée , elle ne m'affiche rien !
    Avez vous une réponse à mon probleme ?
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      8 mars 2006 à 16:47:31

      Bon j'ai pas bien compris ce que tu demandes mais on écrit pas mot="ifbsjk" on écrit sprintf(mot, "ifbsjk");
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        8 mars 2006 à 17:51:48

        Si dans son cas il peut écrire ça :D car dans les arguments de la fonction il n'a pas un tableau (équivalent en un pointeur constant), mais un pointeur, non constant. Enfin, c'est pas beau quand même, ça serait plus propre le strcpy, car avec un strcpy tu modifies les valeurs du tableau, alors qu'avec le = tu modifies la valeur du pointeur, qui contient l'adresse de la constante chaîne entre " ".

        Le problème, c'est juste dans ton printf, t'as pas besoin du [1], il suffit de donner l'adresse de la chaîne donc on met ni * ni [].
        • Partager sur Facebook
        • Partager sur Twitter
          8 mars 2006 à 18:21:28

          daccord , et merci à vous deux , je vous montre le code modifie
          int nbrMotDico()
          {
              FILE* fichier = NULL;
              int nbr = 0;
              char varchar = 0;
              fichier = fopen("dico.txt""r");
              while(varchar != EOF)
              {
                  varchar = fgetc(fichier);
                  if(varchar == '\n')
                  {
                      nbr++;
                  }
              }
              fclose(fichier);
              return nbr+1;
          }
          long nombreAleatoire(long nombreMax)
          {
              srand(time(NULL));
              return (rand() % nombreMax);
          }
          void setMotSecret(char* mot)
          {
              long random = nombreAleatoire(nbrMotDico());
              mot = "bienvenue";
          }


          int main(int argc‚ char *argv[])
          {
              char lettre = 0; // Stocke la lettre proposée par l'utilisateur (retour du scanf)
              char secret[100] = {0}; // C'est le mot à trouver
              setMotSecret(secret);
              printf("%s"‚secret);   
              system("PAUSE");   
              return 0;
          }

          Et il y a toujours un probleme , rien ne s'affiche !
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            8 mars 2006 à 20:20:19

            Dans ce cas, je pense qu'il va falloir un strcpy (mais oui biensûr :D comment ai-je pu ne pas voir ça :D )

            Je te remets un bout de code qui devrait marcher :
            void setMotSecret(char* mot)
            {
                long random = nombreAleatoire(nbrMotDico());
                strcpy (mot‚ "bienvenue");
            }

            Le problème : le pointeur dans les arguments est local à la fonction. On peut modifier les éléments pointés, normal, ce que fait strcpy, mais si on modifie la valeur du pointeur lui même, la modification est locale, et le pointeur au retour n'a pas changé. Ou alors, il faut utiliser un pointeur sur pointeur.
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              8 mars 2006 à 20:36:41

              peut être que je dit une counneri :D mais dans ta fonction 'setmotsecret'
              a la ligne 2 tu a oublier une etoile avant le 'mot'.
              explication;
              toi ta marquer sa:

              void setMotSecret(char* mot)
              {
              long random = nombreAleatoire(nbrMotDico());
              mot = "bienvenue";
              }

              alors quil aurait fallu marquer ceci

              void setMotSecret(char* mot)
              {
              long random = nombreAleatoire(nbrMotDico());
              *mot = "bienvenue";
              }

              Comme 'mot' est un pointeur qui pointe vers un tableau qui est une chaine de caracteres il faut donc dire

              "cher pointeur modifie les valeurs du tableau de char vers le quel tu pointe"

              en mettant une etoile derriere le mot
              parceque sinon sa veut dire

              "pointeur tu aura desormais comme valeur: bonjour"
              (en plus bonjour n'est pas une adresse :) )
              enfin je croie :euh:
              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                8 mars 2006 à 20:54:48

                Et bien non :D

                Car "bonjour" est une constante chaîne crée par le compilateur et remplacée par l'adresse de son premier élément. Ainsi on peut très bien affecter son adresse à un pointeur, sans le * car on s'intéresse à l'adresse contenue dans le pointeur, qui sera celle de la chaîne, et pas à la valeur pointée, qui sera celle du premier caractère de la chaîne. Comme on a un pointeur sur char on pourrait toujours tenter de modifier caractère par caractère, *mot = 'b'; *(mot + 1) = 'o'; ou même mot[1] = 'o'; mais j'ai expliqué pourquoi de toute façon strcpy était plus pratique ;)
                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  8 mars 2006 à 21:15:29

                  aa oki donc la chaine "bonjour" apres la compilation est une adresse? :)

                  • Partager sur Facebook
                  • Partager sur Twitter
                    8 mars 2006 à 21:29:05

                    merci , a vous les gars , ca marche !
                    • Partager sur Facebook
                    • Partager sur Twitter

                    [tableau] et pointeur !!

                    × 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