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 :

Recuperer des entry dans une fonction


Sujet :

GTK+ avec C & C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 24
    Par défaut Recuperer des entry dans une fonction
    bonjour,

    Je travail sur un projet sudoku, et j'ai un problème dans la comparaison des valeurs entrées.
    Mon sudoku est divisé en 9 petits tableaux 3x3, donc par exemple saisie[0][0][0], représente la zone d'entrée sur la première ligne/colonne du premier tableau, saisie[1][0][0] première ligne/colonne du second tableau...

    Enfaite quand j'appuie sur le bouton valider, signal connect envoi un tableau d'entry à ma fonction verification :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_signal_connect(GTK_OBJECT(valider), "clicked",G_CALLBACK(verification), (GtkEntry*)saisie);
    Ensuite J'ai ma fonction verification :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    gboolean verification(GtkWidget *valider, GtkEntry *saisie[9][3][3])
    {
    .......
    }
    quand dans cette fonction j'écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_print("%s", gtk_entry_get_text(saisie[0][0][0]));
    ça m'affiche bien la valeur qui est contenu dans cette zone d'entrée.

    Mais si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(gtk_entry_get_text(saisie[0][0][0]==gtk_entry_get_text(saisie[1][0][0]))
    {
    g_print("erreur");
    }
    Ba ça me fais rien, est-ce que je dois utiliser strcmp ? ou alors il y a un autre moyen de comparer mes 81 cases ?
    Merci

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    Une comparaison de chaîne en C se fait toujours avec strcmp, donc oui tu devrais utiliser strcmp (qui renvoie 0 si les chaînes sont identiques)

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 24
    Par défaut
    je viens d'essayer, ça a lair de bien fonctionner.merci
    Est-ce que tu aurait une idée sur la manière de générer aléatoirement des chiffres entre 1 et 9 et les mettre aléatoirement dans aléatoirement dans des cases ?

  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
    Citation Envoyé par auberstar Voir le message
    je viens d'essayer, ça a lair de bien fonctionner.merci
    Est-ce que tu aurait une idée sur la manière de générer aléatoirement des chiffres entre 1 et 9 et les mettre aléatoirement dans aléatoirement dans des cases ?
    http://library.gnome.org/devel/glib/...m-Numbers.html

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 24
    Par défaut
    merci pour tes réponses

    J'ai une autre question, comme je travail sur un sudoku, il faut que je verifie chaque carré ( yen a 9) j'ai verifié chaque ligne et chaque colonne le code fonctionne bien, mais pour les 9 entrée du premier carré par exemple saisie[0][1], saisie[0][2] ... j'arrive pas à trouver un moyen avec des boucles de verifié si aucune entrée n'est identique j'ai donc voulu mettre chaqu'une des 9 entrée dans un tableau de char, c'est beaucoup plus facile mais mon code ne me donne pas le résultat atendu :
    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
     
    char tab[9];
     
    /* On met les 9 entrées du premier carrée dans un tableau */
    for(i=0;i<9;i++)
    {
    	for(colonne=0;colonne<3;colonne++)
    	{
    		for(ligne=0;ligne<3;ligne++)
    		{
    		tab[i]=gtk_entry_get_text(saisie[colonne][ligne]);
    		}	
     
    	}
    }
     
    for(i=0;i<9;i++)
    {
    	for(j=8;j>i;j--)
    	{
    		if(strcmp(tab[i],tab[j])==0)
    		{
    		popup_message("Probleme dans le carre 1",0);
    		return FALSE;
    		}
     
    	}
    }
    J'ai quand même un message "Probleme dans le carre 1" meme si les 9 entrée sont différentes

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    Si le but de ta première boucle est d'analyser un seul carré, elle ne va pas faire ce que tu veux. Pour la première itération de la boucle, on a i=0, et tu parcours toutes les cases du premier carré en affectant à chaque fois la valeur de la case à tab[0]. Donc au final tab[0] contient la valeur de la dernière case. Ensuite pour i=1, tu refais la même chose et ainsi de suite. Donc au final toutes les cases contiendront la même chose.

    Si j'avais à gérer ce pb, j'utiliserais un tableau de 9 booléens initalisés à FALSE, et pour chaque case, je lirais la valeur qu'elle contient, et j'irais regarder dans mon tableau de booléen la case associée à cette valeur, soit elle est FALSE et je la mets à TRUE, soit elle est TRUE et cette valeur a déjà été rencontrée.

    Pour essayer de résoudre ce genre de problème par toi même, je t'invite à mettre des printf partout pour afficher les différentes valeurs intéressantes et à essayer de comprendre ce qu'li s'affiche.

  7. #7
    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
    Citation Envoyé par auberstar Voir le message
    Mais si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(gtk_entry_get_text(saisie[0][0][0]==gtk_entry_get_text(saisie[1][0][0]))
    {
    g_print("erreur");
    }
    Ba ça me fais rien, est-ce que je dois utiliser strcmp ? ou alors il y a un autre moyen de comparer mes 81 cases ?
    Merci
    Bonjour, déjà tu as un problème de correspondance entre parenthèses, le compte n'y est pas. Ensuite gtk_entry_get_text te renvoie un const gchar *, une chaine de caractères donc. Si tu sais que tu ne peux qu'avoir un chiffre dans cette chaine, tu peux comparer directement le premier caractère. Sinon, oui, pour comparer 2 chaines, il faut forcément passer par strcmp (si tu compares de l'ASCII).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    inline gboolean streq (const gchar *a, const gchar *b)
    {
        return (strcmp (a, b) == 0);
    }
     
    const gchar *a = "1";
    const gchar *b = "1";
    g_assert (a[0] == b[0]); /* correct */
    g_assert (strcmp (a, b) == 0); /* correct */
    g_assert (streq (a, b)); /* correct */
    g_assert (a == b); /* erreur */
    Ensuite, tu devrais étudier le design pattern Modèle-Vue-Contrôleur.
    Tu ne devrais pas avoir à comparer directement des chaînes, mais des valeurs numériques. Après tout, les nombres, c'est ce qu'un ordinateur manipule le mieux ! Et cela simplifiera grandement la lisibilité de ton code.

    Pour bien faire, tu devrais avoir en mémoire ta grille de référence, et la grille remplie par l'utilisateur, mais sous forme numérique. En gros, deux tableaux multidimensions de guint8.

    Quand l'utilisateur remplit un nombre, ta callback se contente de faire la conversion const gchar * vers guint8, et stocke cette valeur dans un tableau "user_grid". Un truc de ce genre (le typedef ne sert qu'à améliorer la lisibilité)...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    typedef guint8 Grid[9][3][3];
    Grid user_grid;
    Une fois que tu as mis ta grille numérique à jour, tu n'as plus qu'à appeler une fonction de vérification de la cohérence de la grille à partir de la case qui vient d'être modifiée... Il faut autant que possible éviter de mettre du code fonctionnel directement dans les callbacks. La callback, via l'interface graphique (la vue) ne sert qu'à modifier les données numériques de ta grille (ton modèle). Tu peux rajouter une fonction qui manipule le tableau à ta place (le contrôleur), pour lire ou écrire des valeurs dans ta grille. L'avantage, c'est que tu pourras plus facilement changer le mode de représentation de ta grille par exemple, sans avoir à changer tout les accès au tableau: il suffira de changer uniquement l'implémentation du contrôleur (le contenu de la fonction), mais pas l'interface (le prototype).

    Tu pourras alors facilement passer d'un tableau 3 dimensions à un tableau à 1 dimension avec une gestion des indices de tableau plus élaborée, ce qui est plus rapide (3 niveaux d'indirection, c'est 3 pointeur à déréférencer, et ça prend plus de temps qu'un simple calcul d'indice à base de multiplication et addition).

    Voilà, j'espère que tu t'en sortiras, mais l'esprit est là, à toi de fouiller un peu

Discussions similaires

  1. Réponses: 8
    Dernier message: 09/06/2006, 16h01
  2. Gestion des buffers dans une fonction
    Par JiJiJaco dans le forum Langage
    Réponses: 2
    Dernier message: 06/01/2006, 11h20
  3. [AS2] déclarer des variables dans une fonction
    Par ooyeah dans le forum ActionScript 1 & ActionScript 2
    Réponses: 12
    Dernier message: 02/08/2005, 12h50
  4. fonction récupérant des valeurs dans une fonction popup...
    Par petitsims dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 20/01/2005, 14h51
  5. Recuperation de formulaire dans une fonction
    Par arsgunner dans le forum ASP
    Réponses: 5
    Dernier message: 23/06/2004, 15h04

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