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 :

condition if avec gtk en c


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Avatar de Micmaya
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2010
    Messages : 131
    Billets dans le blog
    3
    Par défaut condition if avec gtk en c
    Bonjour,

    Avec le code ci-dessous ou je liste une série de valeur dans un "combobox" en Gtk#, j'ai ajouté une fonction qui me permet de savoir ce qui est sélectionné et de l'afficher (comme résultat) mais j'aimerais inclure une condition (if), par exemple:

    si (valeur_selectionne == "Pommes")
    {
    result = "coucou";
    }
    sinon
    {
    result = valeur_selectionne;
    }

    Ci-dessous le code, pour que ce soit plus claire:

    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
     
    #include <stdlib.h>
    #include <gtk/gtk.h>
     
    /* Compilation:
     * gcc $(pkg-config --libs --cflags gtk+-2.0) test.c -o test
     */
     
    gint ButtonPressed(GtkWidget* widget, gpointer data)
    {
    	g_print("You pressed the button.\n");
    	return FALSE;
    }
     
    void combo_selected(GtkWidget *widget, gpointer data)
    {
    	gchar *text = gtk_combo_box_get_active_text(GTK_COMBO_BOX(widget));
    	if (text == "Pomme")
    	{
    		//J'aimerais qu'il m'affiche autre chose que pour la sélection "pomme" qui deviendrait par exemple "pomme verte"
    		text = "pomme verte";
    	}
     
    	gtk_label_set_text(GTK_LABEL(data), text);
    	g_free(text);
    }
     
    int main(int argc, char *argv[])
    {
    	/* Variables */
    	GtkWidget* pWindow;
    	GtkWidget* label; 
    	GtkWidget* selection;
    	//GtkWidget* button;
    	GtkWidget* fixed;
    	GtkWidget* combo;
     
    	gtk_init(&argc, &argv);
     
    	pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL); //Définition de la fenêtre
    	gtk_window_set_title(GTK_WINDOW(pWindow), "test"); //Titre de la fenêtre
    	gtk_window_set_default_size(GTK_WINDOW(pWindow), 400, 130); //Taille de la fenêtre
     
    	fixed = gtk_fixed_new();
    	gtk_container_add(GTK_CONTAINER(pWindow), fixed);
     
    	label = gtk_label_new(NULL); //Texte du label
    	gtk_label_set_markup(GTK_LABEL (label), "<u>Liste de fruits:</u>");
    	gtk_fixed_put(GTK_FIXED(fixed), label, 10, 10);
     
    	//button = gtk_button_new_with_label("Quitter");
    	//gtk_fixed_put(GTK_FIXED(fixed), button, 50, 50);
    	//gtk_widget_set_size_request(button, 80, 35);
     
    	combo = gtk_combo_box_new_text();
    	gtk_fixed_put(GTK_FIXED(fixed), combo, 10, 35);
    	gtk_combo_box_append_text(GTK_COMBO_BOX(combo), "Fraise");
    	gtk_combo_box_append_text(GTK_COMBO_BOX(combo), "Poire");
    	gtk_combo_box_append_text(GTK_COMBO_BOX(combo), "Pomme");
    	gtk_combo_box_append_text(GTK_COMBO_BOX(combo), "Banane");
    	gtk_combo_box_append_text(GTK_COMBO_BOX(combo), "Kiwi");
    	gtk_widget_set_size_request(combo, 150, 30);
     
    	selection = gtk_label_new(NULL);
    	gtk_fixed_put(GTK_FIXED(fixed), selection, 165, 42);
     
    	g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL);
    	//g_signal_connect(G_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(ButtonPressed), NULL);
    	g_signal_connect(G_OBJECT(combo), "changed", G_CALLBACK(combo_selected), selection);
     
    	gtk_widget_show_all(pWindow); //On affiche la fenêtre et ce qu'elle contient
    	gtk_main();
    	return EXIT_SUCCESS;
     }
    Je précise que tout le code fonctionne, sauf ma boucle "if", c'est pourquoi je postule sur ce forum pour la première fois ! (Il faut bien une première), donc soyez indulgent !

    Merci d'avance
    Bien à vous,

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 480
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 480
    Par défaut
    Bonsoir,

    En C, les chaînes de caractères sont considérées comme des tableaux ordinaires, lesquels ne sont pas à proprement parler des objets. Il n'y a donc pas d'opérateur de comparaison « == » explicite pour les chaînes. On utilise à la place la fonction strcmp() (String Compare) :

    Code =C : 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 <string.h>
     
    …
     
        gchar *new = NULL;
        gchar *text = gtk_combo_box_get_active_text(GTK_COMBO_BOX(widget));
     
        if (!strcmp(text,"Pomme"))
        {
            new = "Pomme verte";
        }
        else
        {
            new = text;
        }
     
        gtk_label_set_text(GTK_LABEL(data), new);
        g_free(text);

    J'utilise un second pointeur « new » ici car l'autre inconvénient de ne pas avoir de type chaîne natif est qu'il faut allouer de la mémoire à chaque fois qu'on veut en renvoyer une, et penser à libérer cette mémoire. C'est ce que tu fais avec g_free(). Mais si j'avais directement écrasé le contenu de « text » avec la nouvelle chaîne, je n'aurais pas pu faire les libérations qui s'imposent.

  3. #3
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Bonsoir,

    le problème n'est pas lié à la bibliothèque Gtk+ (Gtk# est l'adaptation pour utiliser la bibliothèque en C#. Tu viens du monde C# ?).

    Sinon pour ton problème, la comparaison de chaines de caractères se fait en utilisant la fonction strcmp (ou mieux strncmp). Je t'encourage à consulter un ou deux tutoriels pour te familiariser avec C et les fonctions de base.
    Si tu te lances dans l'utilisation de GTK+, il y a le pendant non graphique de la bibliothèque : GLib qui regroupe bon nombre de réécritures/encapsulations de fonctions standards comme par exemple g_strcmp0.

    Si tu viens effectivement du monde c# tu vas te trouver face à une gestion complètement différente et des chaines de caractères et de la mémoire en général (attarde toi sur les pointeurs et leurs utilisations).

    Edit: Grillé par obsidian

    Tant que j'y suis, il y a les références obligatoires quand tu utilises les bibliothèques GTK et GLib :
    le manuel de GTK+-2.0 (la version que tu utilises, vérifie la version mineure pour ne pas essayer d'utiliser des fonctions qui ne te seraient pas disponibles, le lien pointe vers la version 2.24)
    le manuel de GLib-2.0 (même remarque, le lien pointe vers la version 2.32)

  4. #4
    Membre éprouvé
    Avatar de Micmaya
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2010
    Messages : 131
    Billets dans le blog
    3
    Par défaut
    Je vous remercie de vos réponses et vos indications à suivre. Je vais donc les suivre avec pertinence, je ne suis pas chez moi pour le moment, et donc je ne peux tester la solution proposée mais dès demain je la testerait et je mètrerait résolu si c'est le cas.

    Encore merci !

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

Discussions similaires

  1. comment faire une condition ou une instruction avec gtk
    Par Invité dans le forum GTK+ avec C & C++
    Réponses: 1
    Dernier message: 31/05/2009, 16h06
  2. [GTK]problème avec GTK+ sur DEV-C++
    Par afrikha dans le forum Dev-C++
    Réponses: 7
    Dernier message: 01/10/2005, 14h13
  3. [GTK]installer Dev-C++ avec gtk 1.2 ...
    Par vbcasimir dans le forum Dev-C++
    Réponses: 2
    Dernier message: 02/02/2004, 13h34

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