GTK Passage de pointeur impossible [Résolu]

Signaler
Messages postés
65
Date d'inscription
dimanche 7 septembre 2003
Statut
Membre
Dernière intervention
17 décembre 2007
-
Messages postés
65
Date d'inscription
dimanche 7 septembre 2003
Statut
Membre
Dernière intervention
17 décembre 2007
-
Bonjour,

je développe actuellement une application sous windows avec Visual Studio 2005 en C avec une interface graphique. Pour développer l'interface graphique j'utilise GTK+.

Malheureusement je me confronte depuis 3 jours à un énorme problème que je n'arrive pas à résoudre et qui me parait absolument incroyable :
Voici en gros le probleme :
j'ai une fonction qui prends en paramètre un pointeur. Quand j'appelle cette fonction en lui passant un pointeur et que je récupère ce pointeur à l'intérieur de la fonction, il ne pointe plus vers la même adresse !
Exemple :

int fonction(void *a)
{
    int *entier = (int*)a;

    printf("%p",a);

    return 0;
}

int main(int argc, char *argv)
{
    int *entier;
    entier = (int *)malloc(sizeof(int));

    printf("%p",entier);
   
    fonction(entier);

    return 0;
}
      
Donc nous voyons que ce programme imprime à l'écran 2 adresses. Normalement elle devraient être égales, malheureusement, dans MON programme ça n'est pas le cas !

Voici donc mon programme, celui ci est un peu plus compliqué :

#include <stdio.h>
#include <tchar.h>
#include <gtk/gtk.h>
#include <glade/glade.h>

app_widgets *local_widgets = NULL;

typedef struct app_widgets
{
    GtkWidget *window_Scopple;
    GtkWidget *entry;
    GtkWidget *label;
}app_widgets;

void on_entry_insert_text(GtkWidget *widget,gpointer data)
{
    app_widgets * local = NULL;
    local = (app_widgets *)data;

    printf("\non_entry: Data   : %p",data);
    printf("\non_entry: local  : %p",local);
}

app_widgets *connect_signals(GladeXML *xml_interface_file,app_widgets *local_widgets)
{
    GladeXML *xml = xml_interface_file;   

    printf("Connect_signal: local_widgets = %p\n",local_widgets);
   

    local_widgets->window_Scopple    = glade_xml_get_widget(xml,"window_Scopple");
    local_widgets->entry        = glade_xml_get_widget(xml,"entry");
    local_widgets->label        = glade_xml_get_widget(xml,"label");

    g_signal_connect(G_OBJECT(local_widgets->entry),"insert_text",G_CALLBACK(on_entry_insert_text),local_widgets);
    g_signal_connect(G_OBJECT(local_widgets->window_Scopple),"destroy",G_CALLBACK(gtk_main_quit),NULL);

    return local_widgets;
}

int _tmain(int argc, char* argv[])
{
    GladeXML *xml;

    local_widgets = g_malloc(sizeof(app_widgets));

    gtk_init(&argc, &argv);

    /* load the interface */
    xml = glade_xml_new("E:\\Documents\\Visual Studio 2005\\Projects\\Scopple\\debug\\scopple.glade", NULL, NULL);
    g_assert(xml != NULL);

    /* connect the signals in the interface */       
    glade_xml_signal_autoconnect(xml); //Cette fonction est une fontion que j'ai créée moi même

    /* start the event loop */
    gtk_main();

    return 0;
}

La sortie de ce programme est la suivante :

Connect_signal: local_widgets = 003E8D98
on_entry: data = 0242E8F0
on_entry: local = 0242E8F0

Comme on peut le constater les adresses ne sont pas les mêmes ! Et c'est pas normal !
Quelqu'un aurait une idée pour résoudre mon problème ? J'ai vraiment tout essayé j'en ai marre.

Merci d'avance.

Cordialement.

2 réponses

Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
A mon avis, c'est la définition du callback qui est mauvais.

void on_entry_insert_text(GtkWidget *widget,gpointer data) <= Toi tu as mis ca.

Imagine que ce soit ca:
void on_entry_insert_text(GtkWidget *widget, gchar * sz, gpointer data)

En cherchant vite fait sur le net, je trouvee ca (le signal n'est pas le meme, mais ca peut te donner une piste de recherche). Et dans ce cas, on comprend bien, pk ton pointeur est faux.
"insert-at-cursor" : void user_function(GtkEntry *entry, gchar *arg1, gpointer user_data);
Messages postés
65
Date d'inscription
dimanche 7 septembre 2003
Statut
Membre
Dernière intervention
17 décembre 2007

Merci beaucoup c'était ça !

j'ai déclarer ma fonction comme ça :

void on_entry_insert_text(GtkEditable     *editable,
                                        gchar           *new_text,
                                        gint             new_text_length,
                                        gpointer         position,
                                        gpointer         user_data)

et ça marche ! Merci beaucoup !