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 :

modifier une table


Sujet :

GTK+ avec C & C++

  1. #1
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 597
    Points : 7 832
    Points
    7 832
    Par défaut modifier une table
    Bonjour

    Je continue de travailler mon pouspous !
    Il est disponible sur http://troumad.org/Linux/essai/main.zip

    Maintenant, on peut changer l'image en cours de partie.
    J'aimerai aussi changer le découpage. Pour celà, il faut que je modifie ma table. J'ai bien essayé avec gtk_table_resize(table,dim_x,dim_y);. Mais je pense que le problème vient plutôt de ce que j'ai mis dans les cases :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     for (i=0;i<dim_x;i++)
     {
      for(j=0;j<dim_y;j++)
      {
       gtk_image_set_from_pixbuf(image[i][j],pourdessin[pous[i][j]/dim_x][pous[i][j]%dim_x]);
       case_table[i][j]=gtk_event_box_new();
       gtk_container_add(GTK_CONTAINER(case_table[i][j]),image[i][j]);
       gtk_widget_add_events(case_table[i][j],GDK_BUTTON_PRESS_MASK);
       g_signal_connect(G_OBJECT(case_table[i][j]), "button_press_event", G_CALLBACK(callback_label), &case_click[i][j]);
       gtk_table_attach(GTK_TABLE(table),case_table[i][j],i,i+1,j,j+1,GTK_SHRINK,GTK_SHRINK,0,0);
      }
     }
    En effet, ça ne plante que si ça a déjà été initialisé

    nb : pour le moment, il faut x=y... J'ai changé parfois la place des paramètres pour une meilleure lisibilité... Ça ne marche plus
    Je viens peut-être de corriger donc x!=y est à tester, mais je me couche !
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 176
    Points : 116
    Points
    116
    Par défaut
    Bonjour , j'ai lu en diagonale le code je ne vois pas d'erreur " grossière " . As-tu essayé avec un débuggueur ? Histoire de voir ou se situe l'erreur ...

    Sinon je n'ai pas très bien compris quand est ce que l'erreur se produit ( si tu pouvais détaillé ) merci

  3. #3
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 597
    Points : 7 832
    Points
    7 832
    Par défaut
    Je suis gêné pour débugguer car je ne sais quel logiciel je pourrais utiliser sous Linux !
    Je n'en ai jamais fait sous Linux.

    Le plantage se fait lorsque je demande un autre découpage. L'affichage de la table reste figée et le reste fonctionne.
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  4. #4
    Membre confirmé Avatar de Lunixinclar
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2006
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 416
    Points : 489
    Points
    489
    Par défaut
    Il y a beaucoup trop de warnings pour donner un avis. Un warning est souvent un signe annonciateur. Il faudrait régler les warnings, les transtypages, et porter attention aux messages sur des assertions manquées pendant l' exécution (lancer l' appli depuis une console). Après, la table pourrait être carrément détruite puisque la partie recommence.
    Mais le jeu est super, bravo.

  5. #5
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 597
    Points : 7 832
    Points
    7 832
    Par défaut
    Citation Envoyé par Lunixinclar
    Après, la table pourrait être carrément détruite puisque la partie recommence.
    Si c'est possible ça m'intéresse ! J'ai fait ce jeu pour comprendre un peu gtk que je ne connaissais pas du tout avant.
    Citation Envoyé par Lunixinclar
    Mais le jeu est super, bravo.
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  6. #6
    Membre confirmé Avatar de Lunixinclar
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2006
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 416
    Points : 489
    Points
    489
    Par défaut
    Bon comme disait l' autre le savoir est la seule chose qui s'accroit quand il est partagé.
    main.c: Dans la fonction « nouvelle_image »:
    main.c:342: attention : passage de l'argument n°1 de « gtk_image_set_from_pixbuf » d'un type pointeur incompatible
    main.c: Dans la fonction « menu_aide »:
    main.c:360: attention : passage de l'argument n°1 de « gtk_label_set_line_wrap » d'un type pointeur incompatible
    main.c:368: attention : passage de l'argument n°1 de « gtk_label_set_line_wrap » d'un type pointeur incompatible
    main.c:376: attention : passage de l'argument n°1 de « gtk_label_set_line_wrap » d'un type pointeur incompatible
    main.c:381: attention : passage de l'argument n°1 de « gtk_label_set_justify » d'un type pointeur incompatible
    main.c:382: attention : passage de l'argument n°1 de « gtk_label_set_justify » d'un type pointeur incompatible
    main.c:383: attention : passage de l'argument n°1 de « gtk_label_set_justify » d'un type pointeur incompatible
    main.c: Dans la fonction « menu_a_propos »:
    main.c:401: attention : passage de l'argument n°1 de « gtk_label_set_line_wrap » d'un type pointeur incompatible
    main.c:404: attention : passage de l'argument n°1 de « gtk_label_set_justify » d'un type pointeur incompatible
    main.c: Dans la fonction « menu_licence »:
    main.c:424: attention : passage de l'argument n°1 de « gtk_label_set_justify » d'un type pointeur incompatible
    main.c: Dans la fonction « taille »:
    main.c:455: attention : passage de l'argument n°1 de « gtk_object_destroy » d'un type pointeur incompatible
    main.c:456: attention : passage de l'argument n°1 de « gtk_object_destroy » d'un type pointeur incompatible
    main.c:517: attention : passage de l'argument n°1 de « gtk_table_resize » d'un type pointeur incompatible
    main.c:526: attention : affectation d'un type pointeur incompatible
    main.c:453: attention : statement with no effect
    main.c:450: attention : statement with no effect
    main.c:573:5: attention : « /* » à l'intérieur d'un commentaire
    main.c: Dans la fonction « signal_morceaux »:
    main.c:607: attention : passage de l'argument n°1 de « gtk_image_set_from_pixbuf » d'un type pointeur incompatible
    main.c:342: attention : passage de l'argument n°1 de « gtk_image_set_from_pixbuf » d'un type pointeur incompatible
    Remplacer
    gtk_image_set_from_pixbuf(petite_image,petite);
    par
    gtk_image_set_from_pixbuf(GTK_IMAGE(petite_image),petite);


    main.c:360: attention : passage de l'argument n°1 de « gtk_label_set_line_wrap » d'un type pointeur incompatible
    Remplacer
    gtk_label_set_line_wrap(GTK_BOX (d_label1),FALSE);
    par
    gtk_label_set_line_wrap(GTK_LABEL (d_label1),FALSE);

    Idem pour les suivants: un label ne peut être casté en BOX ce n'est pas un container!

    main.c:455: attention : passage de l'argument n°1 de « gtk_object_destroy » d'un type pointeur incompatible
    Remplacer
    gtk_object_destroy(image[i][j]);
    par
    gtk_widget_destroy(image[i][j]);

    main.c:517: attention : passage de l'argument n°1 de « gtk_table_resize » d'un type pointeur incompatible
    Remplacer
    gtk_table_resize(table,dim_x,dim_y);
    par
    gtk_table_resize(GTK_TABLE(table),dim_x,dim_y);

    main.c:526: attention : affectation d'un type pointeur incompatible
    pourdessin[i]=(GdkPixbuf *)malloc(dim_y*sizeof(GdkPixbuf *));
    Hey tu l'as déclaré en GdkPixbuf ***
    pourdessin[i]=(GdkPixbuf **)g_malloc(dim_y*sizeof(GdkPixbuf *));

    D'autre part, utiliser de préférence g_malloc et g_free pour assurer la portabilité en évitant les includes C ! En effet à lui seul #include <gtk/gtk.h> inclut beaucoup de fichiers. En fait tes includes se résument à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include<stdlib.h>
    #include<gtk/gtk.h>
    //#include <gdk-pixbuf/gdk-pixbuf.h>
    //#include <gdk/gdk.h>
    #include<string.h>
    //#include<glib.h>
    #include<time.h>

    main.c:453: attention : statement with no effect
    Remplacer
    for (j=0;j++;j<dim_y)
    par
    for (j=0; j<dim_y; j++) //(c'était fait exprès hein?)


    main.c:450: attention : statement with no effect
    for(i=0;i++;i<dim_x)
    bis repetita placent

    main.c:573:5: attention : « /* » à l'intérieur d'un commentaire
    un oubli

    main.c:607: attention : passage de l'argument n°1 de « gtk_image_set_from_pixbuf » d'un type pointeur incompatible
    Remplacer
    gtk_image_set_from_pixbuf(image[i][j],pourdessin[pous[i][j]/dim_x][pous[i][j]%dim_x]);
    par
    gtk_image_set_from_pixbuf(GTK_IMAGE(image[i][j]),pourdessin[pous[i][j]/dim_x][pous[i][j]%dim_x]);



    Voilà c'est maintenant présentable dans la console. A ce sujet, petite astuce
    pour la compilation: dans .bashrc placer
    alias cgtk='gcc -Wall `pkg-config --cflags --libs gtk+-2.0` -fomit-frame-pointer -s -O2 -o '
    et pour compiler/exécuter rapidement un prog gtk je fais
    $ cgtk nomexe main.c && ./nomexe


    A présent le vif du sujet.
    Avant de détruire la table avec gtk_widget_destroy (en castant correctement le premier argument), libères les pixbuf et tout ce que la table contient. Puis recréer la table. En fait cette étape de suppression devrait être faite au début de chaque partie : if (pointeur_vers_table) destroy_table
    Mais si tu y arrives avec gtk_table_resize tant mieux, tous les chemins mènent à Rome.

  7. #7
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 597
    Points : 7 832
    Points
    7 832
    Par défaut
    Je répondais vite pour dire que j'avais mis une version sans warning en ligne... Et je vois ton travail
    Bon, j'ai sport ce soir, je regarde demain

    Es-tu arrivé à refaire la table après destruction ? Il ne me reste plus que ce problème !
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  8. #8
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 597
    Points : 7 832
    Points
    7 832
    Par défaut
    Citation Envoyé par Lunixinclar
    Voilà c'est maintenant présentable dans la console. A ce sujet, petite astuce
    pour la compilation: dans .bashrc placer
    alias cgtk='gcc -Wall `pkg-config --cflags --libs gtk+-2.0` -fomit-frame-pointer -s -O2 -o '
    et pour compiler/exécuter rapidement un prog gtk je fais
    $ cgtk nomexe main.c && ./nomexe
    J'ai oublié des choses à ce niveau et j'aurais carrément besoin d'une mise à jour sur les makefile

    Citation Envoyé par Lunixinclar
    A présent le vif du sujet.
    Avant de détruire la table avec gtk_widget_destroy (en castant correctement le premier argument), libères les pixbuf et tout ce que la table contient. Puis recréer la table. En fait cette étape de suppression devrait être faite au début de chaque partie : if (pointeur_vers_table) destroy_table
    gtk_widget_destroy même pour les pixbuf ? Je vais essayer !
    Si je "gtk_widget_destroy" la table elle va se remettre au bon endroit ?

    Citation Envoyé par Lunixinclar
    Mais si tu y arrives avec gtk_table_resize tant mieux, tous les chemins mènent à Rome.
    Je n'y arrive pas !

    Pour le moment, mais essais me laissent assez perplexe ! Tout d'abord la place du menu que je voudrait en haut passe d'en bas à au milieu...

    Ensuite rien... La table ne réapparait pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    [...]
    if (table) gtk_object_destroy(GTK_OBJECT(table));
    [...]
     table=gtk_table_new(dim_x,dim_y,FALSE);
     gtk_table_set_row_spacings(GTK_TABLE (table),2);
     gtk_table_set_col_spacings(GTK_TABLE (table),2);
     gtk_box_pack_start(GTK_BOX(p_main_box),table,FALSE,FALSE,0);
    [...]
    Je suis sur que cette méthode marche au moins pour la première table. La première fois elle affiche bien la table ! Après, la table s'efface et plus rien n'apparait !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gtk_object_destroy(GTK_OBJECT(pourdessin[i][j])); /* c'est un pixbuf */
    ne marche pas.

    Le suite dès que j'ai le temps. Ce soir peut-être...
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  9. #9
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 597
    Points : 7 832
    Points
    7 832
    Par défaut
    Bonsoir

    En prenant de gros row_spacing et col_spacings , je vois que j'ai un nombre de cases qui correspond à ce que je demande : la place minimale nécessaire varie en fonction de ce nombre. Mon problème est donc que la première fois, j'arrive à remplir ces cases, mais pas les autres fois !
    Pourquoi ?

    Le remplissage se fait avec :
    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
    void signal_morceaux()
    {
     unsigned short i,j;
     
     for (i=0;i<dim_x;i++)
     {
      for(j=0;j<dim_y;j++)
      {
       gtk_image_set_from_pixbuf(GTK_IMAGE(image[i][j]),pourdessin[pous[i][j]/dim_y][pous[i][j]%dim_y]);
       case_table[i][j]=gtk_event_box_new();
       gtk_container_add(GTK_CONTAINER(case_table[i][j]),image[i][j]);
       gtk_widget_add_events(case_table[i][j],GDK_BUTTON_PRESS_MASK);
       g_signal_connect(G_OBJECT(case_table[i][j]), "button_press_event", G_CALLBACK(callback_label), &case_click[i][j]);
       /*gtk_table_attach(GTK_TABLE(table),case_table[i][j],i,i+1,j,j+1,GTK_SHRINK,GTK_SHRINK,0,0);*/
       gtk_table_attach_defaults(GTK_TABLE(table),case_table[i][j],i,i+1,j,j+1);
      }
     }
    }
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  10. #10
    Membre confirmé Avatar de Lunixinclar
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2006
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 416
    Points : 489
    Points
    489
    Par défaut
    C'est peut-être une question de gtk_widget_show() pour les widgets contenus dans la table.

    Le pixbuf, il faut le déférencer après l' avoir passé dans un controle image. Finalement, faire un destroy sur l' image et c'est tout.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    gtk_image_set_from_pixbuf(GTK_IMAGE(img), pixbuf);
    g_object_unref(pixbuf);
    ...
    gtk_widget_destroy(img);
    Tu vas pas sortir un makefile juste pour un seul objet quand même

  11. #11
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 597
    Points : 7 832
    Points
    7 832
    Par défaut
    Citation Envoyé par Lunixinclar
    C'est peut-être une question de gtk_widget_show() pour les widgets contenus dans la table.
    Gagné ! Je l'avais fait, mais pas où il fallait ! :merci :

    Citation Envoyé par Lunixinclar
    Tu vas pas sortir un makefile juste pour un seul objet quand même
    Non
    Mais j'ai très envie de réapprendre à faire un makefile !

    Il reste un problème que je vais mettre dans un autre fil : la place des widget par rapport au menu (ou je vais traité ça autrement....)

    Ma table change de place lors de sa réapparition ! Elle n'est plus en bas
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

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

Discussions similaires

  1. Access : Modifier une table via VB
    Par Tsuna78 dans le forum Access
    Réponses: 11
    Dernier message: 06/03/2007, 14h07
  2. Lire et modifier une table avec plusieurs TQuery
    Par Alyx² dans le forum Bases de données
    Réponses: 4
    Dernier message: 18/08/2006, 13h09
  3. modifié une table à partir d'une requete
    Par moicats dans le forum Access
    Réponses: 5
    Dernier message: 15/05/2006, 16h37
  4. Impossible de modifier une table derrière un query ?
    Par Mihalis dans le forum Bases de données
    Réponses: 2
    Dernier message: 07/04/2006, 11h11
  5. Modifier une table MySQL via un lien
    Par Hayabusa dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 08/02/2006, 22h51

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