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 :

pointeur char - value computed is not used


Sujet :

C

  1. #1
    Membre à l'essai
    Inscrit en
    Février 2009
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 44
    Points : 20
    Points
    20
    Par défaut pointeur char - value computed is not used
    Bonjour,

    J'ai un warning que je ne comprends pas... quelqu'un saurait-il comment le faire disparaitre ? (pas le droit de répondre "en enlevant -Wall à la compilation" :p)


    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
     
    char *trim(char *s)
    {
            char *p;
            int i;
     
            p = calloc(strlen(s), sizeof(char));
     
            i = 0;
            while(*s)
            {
                    if( (*s != 0x20) && (*s != '\n') && (*s != '\t') )
                            p[i++] = *s;
                    *s++;
            }
     
            return p;
    }
    Le warning est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    h_misc.h: In function 'trim':
    h_misc.h:37: warning: value computed is not used

    La ligne 37 étant " *s++; " (dans le while après le if).


    Merci pour vos réponses !

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Qu'est ce que tu veux faire dans cette ligne de code.

    Humainement, il y a 2 interprétations possibles, informatiquement, il n'y en a qu'une.
    • 1ere interprétation humaine : incrementer (de 1) l'objet pointé par la variable s
    • 2eme interprétation humaine : incrémenter (de 1) le pointeur s et récupérer la valeur pointée par la nouvelle valeur du pointeur. A signaler que dans ce cas, tu ne fais rien de la valeur récupérée, c'est comme si dans un code tu écrivais i; ou encore 12; ce qui est totalement légal et autorisé mais rigoureusement inutile.


    Maintenant, si on prend l'interprétation informatique, il n'y en a qu'une et cette interprétation se déduite de la priorité des operateurs.

    Comme ++ est plus prioritaire que *, on fait d'abord une post incrémentation et ensuite un déréférencement. Comme tu n'utilise pas la valeur déréférencée, le compilateur génère un warning.

    C'est une faute classique aux débuts du C.

    Si tu veux faire l'inverse, il faut mettre des parenthèses (*s)++;
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    est interprété comme
    Il correspond à calculer une valeur : *(une adresse), valeur placée à une adresse, et on n'en fait rien. C'est un peu comme si on écrivait 3;
    Ce code n'a d'effet que par ses effets de bord (s++).
    Autant écrire s++ et il n'y aura plus de warning
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par n0mad Voir le message
    J'ai un warning que je ne comprends pas... quelqu'un saurait-il comment le faire disparaitre ? (pas le droit de répondre "en enlevant -Wall à la compilation" :p)
    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
     
    char *trim(char *s)
    {
            char *p;
            int i;
     
            p = calloc(strlen(s), sizeof(char));
     
            i = 0;
            while(*s)
            {
                    if( (*s != 0x20) && (*s != '\n') && (*s != '\t') )
                            p[i++] = *s;
                    *s++;
            }
     
            return p;
    }
    Le warning est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    h_misc.h: In function 'trim':
    h_misc.h:37: warning: value computed is not used
    La ligne 37 étant " *s++; " (dans le while après le if).
    Le commentaire du compilateur est tout à fait correct.
    *s++ ne fait pas ce que tu crois (en fait, il fait s++, c'est tout).

    Tu veux donc soit
    s++ qui signifie s = s + 1
    soit
    (*s)++ qui signifie *s = *s + 1

    D'autre pas, je ne vois pas bien pourquoi tu crées une tableau supplémentaire. L'original de doit pas être modifié ?

    En tout cas, il manque un +1 dans la taille allouée pour le 0 final (des fois qu'il n'y ait rien à retirer...)

    Et pour désigner le caractère espace, on ne met ni 0x20 ni 32, mais ' '.
    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
     
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
     
    char *trim (char const *s)
    {
       char *p = malloc (strlen (s) + 1);
       if (p != NULL)
       {
          int i = 0;
          int c;
          while ((c = *s) != 0)
          {
             if (!isspace ((unsigned char) c))
             {
                p[i] = c;
                i++;
             }
             s++;
          }
          p[i] = 0;
       }
       return p;
    }
     
    #include <stdio.h>
    int main (void)
    {
       char *s = trim ("hello world");
       if (s != NULL)
       {
          printf ("'%s'\n", s);
          free (s);
       }
       return 0;
    }
    Pas de Wi-Fi à la maison : CPL

  5. #5
    Membre à l'essai
    Inscrit en
    Février 2009
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 44
    Points : 20
    Points
    20
    Par défaut
    Dis donc c'est rapide et précis tout ça

    Je viens donc de tester :
    *(s++);
    et
    (*s)++;

    Evidemment seul le premier fonctionne (du point de vue humain) : à savoir aller chercher le caractère suivant dans la chaine. Cependant l'erreur est toujours la.... moi toujours pas comprendre !

    Je ne connaissait pas la fonction isspace(), je l'utiliserais prochainement.

    Autrement pourquoi je crée un second tableau ? Parce que j'ai pas réussi à modifier la chaine soumise :-p
    Donc non je n'ai aucun besoin de conserver la chaine originale =)

  6. #6
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Evidemment seul le premier fonctionne (du point de vue humain) : à savoir aller chercher le caractère suivant dans la chaine. Cependant l'erreur est toujours la.... moi toujours pas comprendre !
    Tu dois écrire
    s++
    pas *(s++) ni *s++
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  7. #7
    Membre à l'essai
    Inscrit en
    Février 2009
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 44
    Points : 20
    Points
    20
    Par défaut
    mouarf mais quel *** !!!


    Merci diogene :o)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Error: Could not use '(unknown)';
    Par Identifiant dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 22/01/2008, 21h46
  2. Aide sur les pointeurs + char
    Par Deejoh dans le forum Débuter
    Réponses: 13
    Dernier message: 18/09/2007, 12h55
  3. Réponses: 4
    Dernier message: 16/11/2006, 02h10
  4. [Debutant]Tableau de pointeur char (char *)
    Par nephhh dans le forum Débuter
    Réponses: 8
    Dernier message: 03/11/2006, 00h48
  5. tutoriel : Database.Open-Could not use, file already in use
    Par MARTIN Gérard dans le forum XMLRAD
    Réponses: 2
    Dernier message: 04/05/2005, 11h56

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