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 :

Explication d'un code


Sujet :

C

  1. #1
    Membre éclairé
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Par défaut Explication d'un code
    Bonjour,

    j'aurai besoin d'aide pour comprendre le code suivant :
    J'ai mis des printf un peu partout pour voir l'évolution
    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
    #include <stdio.h>
    #include <stdlib.h>
     
    int g(unsigned int n, char *res){
      if (n>9) return 1;
      *res='0'+n;
      return 0;
    }
     
    int f(unsigned int n, char *s, size_t *l){
      char c; size_t cl=*l;
      if(n == 0)
        return 0;
      g(n%10U, s);
      c = *s;
      ++*l;
      f(n/10U, s+1, l);
      printf("*l = %d\n",*l);
      printf("%c\n",c);
      printf("cl = %d : *l/2 = %d\n", cl, *l/2);
      if(cl<*l/2){
        *s=s[*l-cl-1-cl];
        s[*l-cl-1-cl]=c;
      }
      printf("-----");
      printf("*s = %c\n",*s);
      return 0;
    }
     
    int main(void){
      int n;
      char buf[BUFSIZ];/*Suppose tres grand*/
      size_t l=0;
      printf("Entrez un nombre: ");
      if(scanf("%u",&n)==1)
        {
          if(n > 0)
    	f(n, buf, &l);
          else if(n == 0)
    	{
    	  buf[0]='\0';
    	  ++l;
    	}
          else
    	{
    	  fprintf(stderr,"erreur : il ne faut pas donner de valeur negative\n");
    	  return EXIT_FAILURE;
    	}
          buf[l]='\0';
          fprintf(stdout, "%s %u\n", buf, l);
          return EXIT_SUCCESS;
        }
      else return EXIT_FAILURE;
    }
    Ce que j'obtiens à l'affichage :
    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
    ~$ ./test
    Entrez un nombre: 1234
    *l = 4
    1
    cl = 3 : *l/2 = 2
    -----*s = 1
    *l = 4
    2
    cl = 2 : *l/2 = 2
    -----*s = 2
    *l = 4
    3
    cl = 1 : *l/2 = 2
    -----*s = 2
    *l = 4
    4
    cl = 0 : *l/2 = 2
    -----*s = 1
    1234 4
    Les questions que je me pose :
    -Pourquoi *l vaut toujours 4 alors que cl varie
    -Pourquoi lorsque j'affiche la chaine caractere par caractere, je n'ai pas les même caractere que lors de l'affichage de la chaine complete.
    -Pourquoi le résultat obtenu ne donne pas la chaine en ordre inverse comme ça devrait être le cas

    Merci

  2. #2
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Je pense que ++*l ne fait pas ce que tu crois. Tu veux probablement ++(*l) ou (*l)++, ce qui est la même chose.
    Je ne te comprends pas.

    ++*l c'est la même chose que ++(*l) et c'est différent de (*l)++.

  3. #3
    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 Jean-Marc.Bourguet
    Je ne te comprends pas.

    ++*l c'est la même chose que ++(*l) et c'est différent de (*l)++.
    Ah, OK. My bad.

    Je corrige.

    J'aurais apris un truc aujourd'hui. C'est bien, merci.

  4. #4
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Ah, OK. My bad.

    Je corrige.

    J'aurais apris un truc aujourd'hui
    . C'est bien, merci.
    Assez exceptionnel pour être noté.
    Cependant, dans le contexte où c'était écrit,
    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
    int f(unsigned int n, char *s, size_t *l){
      char c; size_t cl=*l;
      if(n == 0)
        return 0;
      g(n%10U, s);
      c = *s;
     
      ++*l;  <===== ici
     
      f(n/10U, s+1, l);
      printf("*l = %d\n",*l);
      printf("%c\n",c);
      printf("cl = %d : *l/2 = %d\n", cl, *l/2);
      if(cl<*l/2){
        *s=s[*l-cl-1-cl];
        s[*l-cl-1-cl]=c;
      }
      printf("-----");
      printf("*s = %c\n",*s);
      return 0;
    }
    les deux notations ++(*l) ou (*l)++ ont le même effet (mais pas tout à fait la même signification c'est vrai).
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  5. #5
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Premium
    Les questions que je me pose :
    -Pourquoi *l vaut toujours 4 alors que cl varie
    Dans tout ton programme sauf dans main *l désigne toujours le même objet: la variable locale l de main. Hors tu l'affiches lors des retours et il n'est pas modifié entre les affichages.

    cl par contre a une valeur pour chaque invocation de f, et cette valeur c'est la valeur de *l au début de cette invocation.

    -Pourquoi lorsque j'affiche la chaine caractere par caractere, je n'ai pas les même caractere que lors de l'affichage de la chaine complete.
    -Pourquoi le résultat obtenu ne donne pas la chaine en ordre inverse comme ça devrait être le cas
    Tu affiches uniquement au retour, donc le dernier en premier.

  6. #6
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    C'est avec les opérateurs postfixes qu'il y a potentiellement confusion: *l++, c'est équivalent à *(l++) pas à (*l)++.

  7. #7
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    Pas de confusion, il suffit d'analyser la priorité des opérateurs :

    () []
    -> .
    ! ~ ++ -- + -
    * & (type) sizeof
    * / %
    + -
    << >>
    < <= > >=
    == !=
    & (et binaire)
    ^
    |
    &&
    ||
    ?:
    = += -= *= /= %=
    <<= >>= &= ^= |=

    Ainsi, l'opérateur ++ est donc bien prioritaire à l'opérateur *.

Discussions similaires

  1. Explication sur du code javascript
    Par griese dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 21/07/2006, 09h40
  2. explications/commentaires de codes
    Par pascal913 dans le forum Access
    Réponses: 24
    Dernier message: 19/07/2006, 14h01
  3. cherche explication sur du code
    Par abdoulzak dans le forum Langage
    Réponses: 1
    Dernier message: 06/07/2006, 10h23
  4. besoin d'explications sur un code
    Par NAHIAG dans le forum C
    Réponses: 8
    Dernier message: 28/05/2006, 12h37
  5. [javascript] explication d'un code
    Par mzt.insat dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 05/04/2006, 23h52

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