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 :

Les fonctions / pointeurs


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 120
    Par défaut Les fonctions / pointeurs
    Bonjour,
    j'ai une question concernant les fonctions/pointeurs:
    dans une fonction je fait int x;
    j'alloue un espace de la mémoire, disons en imageant que l'adresse est la case 16 ( pour simplifié)
    x=10; la case 16 contient l'entier 10

    maintenant dans une autre fonction je passe en paramètre int x
    et je dit dedans que x=12
    la l'entier x sera donc alloué localement dans un espace de la mémoire différente disons que l'adresse est la case 96
    donc cela induit que toutes variables déclarer dans une fonction est définit localement (occupe un espace mémoire spécifique)
    C'est pour cela qu'on passe en paramètre l'adresse, pour pouvoir directement travaillé sur l'espace de la mémoire où est stocker la variable.(je parle dans le cas où on a besoin de la modifié)
    Est ce bien comme cela que sa fonctionne?

    Merci d'avance pour votre aide.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 120
    Par défaut
    Mais voilà une contradiction à ce que j'ai dit avant:

    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
     
    #include<stdio.h>
    void saisie(char *mot){
      printf("saisir un mot:");
      scanf("%s",mot);
    }
     
    void affiche(char *mot){
      printf("%s\n",mot);
    }
    int size(char *mot){
      int i=0,cpt=0;
      while(mot[i]!='\0'){
        cpt++;
        i++;
      }
      return cpt;
    }
     
    void transforme(char *mot){
      int i;
      for(i=0;i<size(mot);i++){
        if(mot[i]==(tolower(mot[i])))
          mot[i]=toupper(mot[i]);
        else
          mot[i]=tolower(mot[i]);
      }
    }
     
    int main(void){
      char mot[50];
      saisie(mot);
      affiche(mot);
      transforme(mot);
      printf("size=%d\n",size(mot));
      affiche(mot);
      return 0;
    }
    Pour la fonction transforme et saisie je modifie "mot" sans passer l'adresse et je l'est bien modifié dans le main...
    Je ne comprend plus du tout
    Les chaînes de caractères ne sont pas définit localement?

  3. #3
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    j'ai une question concernant les fonctions/pointeurs:
    ....
    Est ce bien comme cela que sa fonctionne?
    Oui

    Pour la fonction transforme et saisie je modifie "mot" sans passer l'adresse et je l'est bien modifié dans le main...
    mot est un tableau. L'identificateur d'un tableau (hors le cas des opérateurs sizeof et & (adresse de)) est interprété comme "adresse du premier élément du tableau". Donc tu passes bien l'adresse !

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 120
    Par défaut
    Ok merci , j'essaye de faire apparaitre avec les équivalences, mais je n'arrive pas pour size(mot) (pour le définir localement) (la paramètre aussi qui devrai être un pointeur de pointeur)

    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
     
     
    void transforme(char *(&(*mot))){
      int i;
      for(i=0;i<size(mot);i++){
        if(*(mot+i)==(tolower(*(mot+i))))
          *(mot+i)=toupper(*(mot+i));
        else
          *(mot+i)=tolower(*(mot+i));
      }
    }
    int main(void){
      char mot[50];
      transforme(&(mot[0]));
      return 0;
    }
    mot=mot+0=&(mot[0])
    *mot=mot [0]
    *(mot+i)=mot[i]

  5. #5
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Delnir Voir le message
    Ok merci , j'essaye de faire apparaitre avec les équivalences, mais je n'arrive pas pour size(mot) (pour le définir localement) (la paramètre aussi qui devrai être un pointeur de pointeur)
    Que de complications...
    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
     
    #include <ctype.h>
    #include <stdio.h>
     
    void transforme (char *mot)
    {
       int i;
       for (i = 0; mot[i] != 0; i++)
       {
          if (islower (mot[i]))
          {
             mot[i] = toupper (mot[i]);
          }
          else
          {
             mot[i] = tolower (mot[i]);
          }
       }
    }
     
    int main (void)
    {
       char mot[50] = "Hello world !";
     
       printf ("'%s'\n", mot);
       transforme (mot);
       printf ("'%s'\n", mot);
     
       return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    'Hello world !'
    'hELLO WORLD !'
     
    Process returned 0 (0x0)   execution time : 0.061 s
    Press any key to continue.

  6. #6
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Que de complications...
    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
     
    #include <ctype.h>
    #include <stdio.h>
     
    void transforme (char *mot)
    {
       int i;
       for (i = 0; mot[i] != 0; i++)
       {
          if (islower (mot[i]))
          {
             mot[i] = toupper (mot[i]);
          }
          else
          {
             mot[i] = tolower (mot[i]);
          }
       }
    }
     
    int main (void)
    {
       char mot[50] = "Hello world !";
     
       printf ("'%s'\n", mot);
       transforme (mot);
       printf ("'%s'\n", mot);
     
       return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    'Hello world !'
    'hELLO WORLD !'
     
    Process returned 0 (0x0)   execution time : 0.061 s
    Press any key to continue.
    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
    #include <ctype.h>
    #include <stdio.h>
    #include <stdlib.h>
     
    static void transforme (char * const mot)
    {
       size_t i;
       for (i = 0; mot[i] != 0; i++)
       {
          if (islower ((unsigned char) mot[i]))
          {
             mot[i] = toupper ((unsigned char) mot[i]);
          }
          else
          {
             mot[i] = tolower ((unsigned char) mot[i]);
          }
       }
    }
     
    int main (void)
    {
       char mot[] = "Hello world !";
     
       puts (mot);
       transforme (mot);
       puts (mot);
     
       return 0;
    }

  7. #7
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Ok merci , j'essaye de faire apparaitre avec les équivalences, mais je n'arrive pas pour size(mot) (pour le définir localement) (la paramètre aussi qui devrai être un pointeur de pointeur)
    Pourquoi un pointeur de pointeur ? Je ne comprend pas ton problème

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void transforme(char *(&(*mot))){
    ça ne compile pas ce truc !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void transforme(char *mot){
      int i;
      for(i=0;i<size(mot);i++){
    Pourquoi appeler la fonction à chaque boucle ? Ca coûte cher en temps de reparcourir la chaîne à chaque fois et c'est inutile.

    Ici cpt ne sert à rien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int size(char *mot){
      int i=0;
      while(mot[i]!='\0'){
        i++;
      }
      return i;
    }

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 120
    Par défaut
    Pour les complications, c'est mon tp qui me demande sa
    Mais en faite mon erreur c'est de mélanger les pointeurs et tableau ce qui est complètement différent.
    Sinon si j'ai bien comprit les variables locales par rapport à mon 1er poste sa n'existe pas avec les tableaux? (car on va toujours passer l'adresse)

Discussions similaires

  1. Question sur les pointeurs avec les fonctions
    Par Loester dans le forum Débuter
    Réponses: 2
    Dernier message: 01/02/2012, 22h56
  2. Usage des pointeurs dans les fonctions
    Par didou31 dans le forum Débuter
    Réponses: 12
    Dernier message: 22/11/2011, 13h31
  3. Réponses: 1
    Dernier message: 08/05/2008, 13h13
  4. doc sur les fonctions
    Par masterfab dans le forum C
    Réponses: 18
    Dernier message: 23/06/2005, 17h55
  5. Réponses: 7
    Dernier message: 24/05/2003, 15h56

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