Contenu | Rechercher | Menus

Annonce

Ubuntu 16.04 LTS
Commandez vos DVD et clés USB Ubuntu-fr !

Pour en savoir un peu plus sur l'équipe du forum.

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

#1 Le 13/02/2018, à 19:16

Le_Pa

[Résolu]Comment passer un char* par g_signal_connect avec Ubuntu ?

Bonjour,
J'ai longuement parcouru les pages du web et en particulier celles du forum consacrée à g_signal_connect, sans trouver de réponse à mon problème.
Il s'agit d'un exercice tout simple posé par Openclassroom (https://openclassrooms.com/courses/cree … ces-divers), avec transmission d'un texte par char*. Ce texte, qui devrait ensuite s'afficher ne s'affiche pas. Mon essai de programme est détaillé ci-dessous.
A titre de contrôle, je fais afficher sur la console, outre le texte initial ("Signaux-2" inversé), l'adresse transmise à g_signal_connect, et celle qu'il transmet. Ces deux adresses diffèrent, ce qui explique que le texte ne soit pas transmis.
Voici mon code:

#include <gtk/gtk.h>
#include <stdlib.h>

void ma_fonction(GtkWidget *widget, gpointer gp)
// Fonction d'affichage
{
    gchar* data = (gchar*) gp;
    [color=red ]//On affiche l'adresse reçue[/color]
    g_print("data = %lx    gp = %lx\n", (unsigned long) data, (unsigned long) gp);
    [color=red ]// On devrait retrouver ensuite le message ("Signaux-2" inversé)[/color]
     g_print("[%s]\n", data);
    [color=red ]//Et c'est là que cela foire ![/color]
    gtk_main_quit();
}

int main()
{
    GtkWidget* MainWindow = NULL;
    const gchar* sTitle;
    gint sPosition_x, sPosition_y;
    gint sWidth, sHeight;
    int titleSize = 0;

    gtk_init(NULL, NULL);

    // On va créer une fenetre
    MainWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_position(GTK_WINDOW(MainWindow), GTK_WIN_POS_CENTER);
    gtk_window_set_default_size(GTK_WINDOW(MainWindow), 260,40);
    gtk_window_get_position(GTK_WINDOW(MainWindow), &sPosition_x, &sPosition_y);
    gtk_window_get_default_size(GTK_WINDOW(MainWindow), &sWidth,&sHeight);

    // On lui donne un titre
    gtk_window_set_title(GTK_WINDOW(MainWindow), "Signaux-2");
    sTitle = gtk_window_get_title(GTK_WINDOW(MainWindow));

    //Et maintenant on va inverser les lettres du titre.
    while(sTitle[titleSize] != '\0')
        titleSize++;      //Détermination de la taille du titre
    gchar * pTitle = malloc(titleSize+1);
    for(int i = 0; i < titleSize; i++)
        pTitle = sTitle[titleSize-1-i];
    //N'oublions pas le '\0` final:
    pTitle[titleSize] = sTitle[titleSize];

    //On vérifie l'inversion sur la console
    g_print("%s\n", pTitle);
    //et on affiche sur la console l'adresse de pTitle que l'on va envoyer :
    g_print("pTitle = %lx\n", (unsigned long) pTitle);

    /*On l'envoie maintenant à "ma_fonction" lorsqu'on clique sur la croix de fin
de fermeture de fenetre:*/

    g_signal_connect(G_OBJECT(MainWindow), "delete-event", G_CALLBACK(ma_fonction), (gpointer) pTitle);

    gtk_widget_show(MainWindow);
    gtk_main();
    return 0;
}


Et voici ce qu'affiche la console :

2-xuangiS
pTitle = 1773f00

puis, après que j'ai fermé la fenêtre (avec envoi du signal) :

data = 174d9d0    gp =  174d9d0
[]

Process returned 0 (0x0)  execution time : 5.273 s
press ENTER to continue

Je travaille avec Code::Blocks (svn 11239) (Compilateur équivalent à -std=c90 en mode C et à -std=c++98  en mode C++), et avec gtk+3.0.
Mon OS est Ubuntu 16.04 LTS sur un Presario CQ57.

J'ai vainement cherché d'où venait mon erreur. Si quelqu'un pouvait m'aider, je lui serais infiniment reconnaissant.

Dernière modification par Le_Pa (Le 15/02/2018, à 18:35)

Hors ligne

#2 Le 14/02/2018, à 22:29

Bigcake

Re : [Résolu]Comment passer un char* par g_signal_connect avec Ubuntu ?

Bonsoir,

Le prototype que tu utilise pour ta fonction de callback est mauvais.
Ce n'est pas :

void  user_function (GtkWidget *widget, gpointer user_data)

Mais

gboolean  user_function (GtkWidget *widget, GdkEvent  *event, gpointer user_data)

Dans ton exemple 174d9d0 est donc le pointeur vers la structure GdkEvent

Pour ne pas te tromper dans tes callback de signaux GTK, vérifie bien les prototypes avant, ils ne sont pas tous identiques.
Pour delete-event, tu peux aller ici :
https://developer.gnome.org/gtk3/stable … lete-event

Dernière modification par Bigcake (Le 14/02/2018, à 22:42)


"Les gens" ne sont pas con, ils ont été habitués à la facilité et à la désinformation. Le meilleur moyen de ne pas les aider, c'est de se moquer. Le meilleur moyen de les aider, c'est de les informer, encore et encore. La réflexion viendra. N'oubliez pas que vous aussi, vous êtes le con d'un autre.
Smartphone+GNU/Linux=Librem5
Radio+sons libre=oxyradio.net

Hors ligne

#3 Le 15/02/2018, à 18:36

Le_Pa

Re : [Résolu]Comment passer un char* par g_signal_connect avec Ubuntu ?

Bonsoir "BigCake" et un grand merci pour ta réponse. Tout fonctionne maintenant à merveille.

Hors ligne