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

GTK+ avec C & C++ Discussion :

donner une valeur a un gchar


Sujet :

GTK+ avec C & C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut donner une valeur a un gchar
    salut je voudrais savoir comment donner une valeur a un gchar
    j'ai essayé ce code là mais il ne marche pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    gchar cle;
    cle = "azerty123";
    et je voudrais aussi svoir s(il est possible de comparer 2 gchar ; si oui comment ?

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Ton problème est lié à la méconnaissance du C.

    gchar toto; => toto est un entier signé codé sur 1 octet.

    gchar *toto; => toto est un pointeur sur un espace mémoire de la taille d'un octet.

    Si tu désires allouer un espace suffisant pour un texte, il faudra passer par les pointeurs. On pourrait écrire gchar *toto="Voici le texte". Cette méthode n'est pas vraiment idéale. Même certains compilateurs sont capables de te mettre un warning sur ce genre de déclaration.

    Si tu connais ton texte par avance autant le déclarer en constant : const gchar *toto="Voici le texte".

    Maintenant si la taille du texte est fluctuante, alors tu peux passer par la fonction g_strdup_printf();. Cette fonction alloue de la mémoire dans le tas. donc il faudra une fois son utilisation devenue obsolète libérer la mémoire avec la fonction g_free();.

  3. #3
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    Pour compléter la réponse de gérald, les formes correctes pour allouer une chaîne dans la pile sont:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const gchar *text1 = "bonjour";
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gchar text2[] = "bonjour";
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gchar *text3 = g_strdup ("bonjour");
    La première méthode utilise un pointeur vers une chaine de caractères. Le contenu doit forcément être déclaré en const, car le compilateur tentera de placer la chaîne dans un segment de l'exécutable qui sera en lecture seule (segment .rodata - read only data dans le format ELF [ame="http://en.wikipedia.org/wiki/Executable_and_Linkable_Format"]ELF[/ame] des binaires Linux). Si tu essaies de modifier ce texte, tu auras une erreur de segmentation.

    La deuxième méthode utilise est un tableau de caractères. Il s'agit d'un tableau alloué dans la pile, la chaîne peut donc être modifiée comme toute valeur se trouvant dans la pile, du moment que tu ne dépasses pas les limites imposées par la taille initiale du tableau (ici, 8 octets, 7 pour les lettres de bonjour, + 1 pour le caractère de fin de chaîne).

    Enfin, la troisième méthode utilise un pointeur et alloue le texte dans le tas. g_strdup ne fait qu'allouer de la mémoire et copier la chaine qui lui est passée en paramètre dans cette mémoire nouvellement allouée. g_strdup_printf est utilisée quand la chaine à allouer peut varier, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int n_choux = 3;
    char *text4 = g_strdup_printf ("j'ai mangé %d choux", n_choux);
    À noter que sizeof (text1) vaut sizeof (char *), soit 4 octets en 32 bits (la taille d'un pointeur), idem pour text3 et text4. En revanche, text2 étant un tableau, sizeof (text2) = 8, qui est ici la taille du tableau.

  4. #4
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    Et pour comparer 2 chaines de caractères :

    Si tu travailles en ASCII, et que la casse est importante (différence entre majuscules et minuscules):
    Si tu travailles en ASCII, mais que la casse n'est pas importante:
    Si tu travailles en UTF-8, il faut d'abord appeler :
    Ensuite, à partir de la chaine qu'a renvoyé cette fonction, tu peux utiliser les fonctions strcmp (prend en compte la case) et strcasecmp (ignore la casse) de la bibliothèque C standard.

Discussions similaires

  1. Réponses: 2
    Dernier message: 22/01/2007, 13h12
  2. donner une valeur nulle pour une liste déroulante
    Par sam01 dans le forum Langage
    Réponses: 3
    Dernier message: 15/10/2006, 15h45
  3. [Etat]donner une valeur à un champs par le code
    Par guigui5931 dans le forum IHM
    Réponses: 6
    Dernier message: 04/07/2006, 12h11
  4. donner une valeur par defaut à un champ file
    Par Davboc dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 24/02/2006, 11h26
  5. Réponses: 2
    Dernier message: 07/07/2005, 18h11

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