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 :

const char *


Sujet :

C

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    280
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 280
    Par défaut const char *
    Bonjour,
    Alors voilà mon problème :
    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
    #include <getopt.h>
    #include <stdio.h>
    #include <stdlib.h>
    /* Nom du programme. */
    const char* program_name;
    /* Envoie les informations sur l'utilisation de la commande vers STREAM
    (typiquement stdout ou stderr) et quitte le programme avec EXIT_CODE.
    Ne retourne jamais. */
    void print_usage (FILE* stream, int exit_code)
    {
    fprintf (stream, "Utilisation : %s options [fichierentrée ...]\n",
    program_name);
    fprintf (stream,
    " -h --help Affiche ce message.\n"
    " -o --output filename Redirige la sortie vers un fichier.\n"
    " -v --verbose Affiche des messages détaillés.\n");
    exit (exit_code);
    }
    L'auteur de cet exemple en 5 eme ligne déclare une constante mais ne lui donne pas une valeur ?! comprends pas...
    encore ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void fonction( const char * pointeur )
    je peux comprendre. La fonction reçoit un pointeur vers une valeur qu'elle ne doit pas modifier ok...
    Mais dans l'exemple précédent...
    Quelqu'un peut il m'éclairer s'il vous plait ? Merci

  2. #2
    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
    Tel qu'il est, on a program_name == NULL.
    Ce programme est sans doute le squelette d'un exemple, un programme incomplet.
    Il manque (ou il y aura quelque part) un program_name =....

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    280
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 280
    Par défaut
    Bonjour,

    non c'est un exemple complet le code entier est disponible p21 du livre disponible ici. en effet dans le main ce qui est pointé par program_name prendra comme valeur la chaîne argv[0] (le nom du programme). Ce qui a fait me poser des questions c'est que const pour moi empêchait précisement la modification du contenu de l'emplacement mémoire pointée par program_name en fait il interdit la modification mais ce qui est pointé n'est pas la chaîne mais le premier caractère de cette chaîne. Ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const char* program_name;
    n'interdit pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    program_name = argv[0];
    mais interdit :
    autant que :
    Voilà j'ai un peu avancé hier soir sur mon problème mais cela reste encore un peu flou, des précisions seront bienvenue...

    @diogene j'ai vu ta publication je vais y jeter un oeuil peut-être que ça répondra à mes questions...
    Merci d'avoir répondu.

  4. #4
    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
    non c'est un exemple complet
    Non, il manquait justement le main() dans ce que tu as posté. Et d'ailleurs, j'avais pris la précaution de dire :
    Il manque (ou il y aura quelque part) un program_name =....
    const char* program_name; déclare un pointeur non constant sur un char ou un tableau de char qui ne sont pas modifiable(s). char const * program_name; également.

    Par contre
    -char* const program_name;déclare un pointeur constant sur un char ou un tableau de char qui sont modifiable(s) (donc un pointeur qui doit être initialisé à la création, le contenu du char ou du tableau de char pouvant être lui obtenu par affectation)

    -const char* const program_name;déclare un pointeur constant sur un char ou un tableau de char qui ne sont pas modifiable(s).

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    280
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 280
    Par défaut
    Citation:
    non c'est un exemple complet

    Non, il manquait justement le main() dans ce que tu as posté. Et d'ailleurs, j'avais pris la précaution de dire :
    quand je parlais d'exemple complet je parlais de celui du livre pas de ce que j'avais posté puisque tu me disais :
    Ce programme est sans doute le squelette d'un exemple, un programme incomplet.
    Je m'excuse j'aurais dû dire un programme complet cela aurait été plus clair.

    const char* program_name; déclare un pointeur non constant sur un char ou un tableau de char qui ne sont pas modifiable(s). char const * program_name; également.
    oui c'est ce que j'ai compris en effet... Pourtant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    program_name = argv[0];
    modifie bien le tableau de char pointé par program_name puisqu'il y place le nom du programme... d'où mon questionnement...

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Citation Envoyé par PyNub Voir le message
    Pourtant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    program_name = argv[0];
    modifie bien le tableau de char pointé par program_name puisqu'il y place le nom du programme... d'où mon questionnement...
    Ben non, ça modifie seulement le pointeur, le faisant pointer sur la même chaîne pointée par argv[0].
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    280
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 280
    Par défaut
    Ben non, ça modifie seulement le pointeur, le faisant pointer sur la même chaîne pointée par argv[0].
    oui c'est vrai argv[0] est un pointeur vers une chaîne...

    mais alors que penser de ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void fonction( const char * pointeur )
    {
            pointeur[0] = 0;     /* erreur*/
            pointeur    = "Nouvelle chaine de caractères";
    }
    j'ai trouvé cet exemple ici

    Merci !

  8. #8
    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
    mais alors que penser de ça :....
    C'est la même chose :
    pointeur est un pointeur sur des char constants d'où l'erreur d'écrire pointeur[0] = 0;Par contre pointeur = "Nouvelle chaine de caractères"; est correct puisqu'il met dans ce pointeur l'adresse d'une chaine en l'occurence de char non modifiables. Si cette chaine était modifiable, elle ne pourrait pas l'être à partir de pointeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            char tab[]= "abcdef";
            const char * pointeur = tab ;
            pointeur[0] = 'x';     /* erreur*/
            tab[0] = 'x'; /*OK*/

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    280
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 280
    Par défaut
    D'autant non modifiable qu'elle est stockée dans le code du programme (j'ai regardé avec un editeur héxadécimal) .

    En fait la spécification de const dans le programme se justifie parcequ'on fait pointer vers une chaîne de argv qui ne fait pas partie du code...

    Merci pour toutes ces précisions.

  10. #10
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Citation Envoyé par PyNub Voir le message
    mais alors que penser de ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void fonction( const char * pointeur )
    {
            /* pointeur[0] = 0;     erreur*/
            pointeur    = "Nouvelle chaine de caractères";
    }
    Essaie ta fonction avec ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int main(void)
    {
    	char const *chn = "une chaine";
    	puts(chn);
    	fonction(chn);
    	puts(chn);
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    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
    Citation Envoyé par PyNub Voir le message
    D'autant non modifiable qu'elle est stockée dans le code du programme (j'ai regardé avec un editeur héxadécimal)
    Exact

    En fait la spécification de const dans le programme se justifie parcequ'on fait pointer vers une chaîne de argv qui ne fait pas partie du code...
    C'est une précaution utile de spécifier const même dans le cas précédent. C'est un garde fou, car sinon le compilateur ne râlerait pas si on essayait de modifier la chaine et le programme planterait.

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    280
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 280
    Par défaut
    C'est une précaution utile de spécifier const même dans le cas précédent. C'est un garde fou, car sinon le compilateur ne râlerait pas si on essayait de modifier la chaine et le programme planterait.
    En effet ça peut amener une sécurité supplémentaire...

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    280
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 280
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Essaie ta fonction avec ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int main(void)
    {
    	char const *chn = "une chaine";
    	puts(chn);
    	fonction(chn);
    	puts(chn);
    }
    En effet on se rend bien compte que fonction ne change pas la valeur de ce qui est pointé mais l'adresse contenue par le pointeur
    Le fait de déclarer chn constant n'a pas d'incidence car dans la fonction le pointeur à un autre nom

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    280
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 280
    Par défaut
    Par contre ça :
    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
    #include<stdio.h>
     
    void fonction (char const * pointeur){
    	puts(pointeur);
    	pointeur="Nouvelle chaine";
    	puts(pointeur);
    }
     
    int main (){
    	const char const * chn = "une chaine";
    	puts(chn);
    	chn="une autre chaine";
    	fonction(chn);
    	puts(chn);
    	return(0);
    }
    ça marche ... quelle est la différence entre
    char const * chn
    et
    const char * chn ?

    J'ai bien compris que ce qui ne marchait pas c'était :
    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
    #include<stdio.h>
     
    const char * const chn = "une chaine";
    void fonction (char const * pointeur){
    	puts(pointeur);
    	pointeur="Nouvelle chaine";
    	chn="nouvelle chaine"; /*erreur*/
    	puts(pointeur);
    }
     
    int main (){
    	puts(chn);
    	chn="une autre chaine";/*erreur*/
    	fonction(chn);
    	puts(chn);
    	return(0);
    }

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    280
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 280
    Par défaut
    Il faut avoir les yeux en face des trous pour faire du C...

  16. #16
    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
    ... quelle est la différence entre
    char const * chn
    et
    const char * chn ?
    Aucune différence (cf post #4)

  17. #17
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    280
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 280
    Par défaut
    Citation Envoyé par diogene Voir le message
    Aucune différence (cf post #4)
    Il me semblait bien merci !

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 28/10/2005, 12h11
  2. [Appli Console]Pb exec command ac fct system(const char *)
    Par Le_magicien999 dans le forum MFC
    Réponses: 2
    Dernier message: 16/08/2005, 16h07
  3. Conversion CString en const char*
    Par LRobi dans le forum MFC
    Réponses: 8
    Dernier message: 19/07/2005, 12h12
  4. Réponses: 13
    Dernier message: 06/03/2005, 15h21
  5. Pb d'nitialisation d'un const char*
    Par davkick dans le forum C++
    Réponses: 9
    Dernier message: 09/12/2004, 16h27

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