Bonjour,

J'ai réussi à mettre en place l'interface de ma calculatrice et elle réagit normalement au clic sur les différents boutons. En revanche maintenant j'essaye d'afficher dans la console le contenu du textView qui me sert d'écran et j'obtiens un segfault.

Jai essayé de séparer les différentes phases de création de la fenêtre et je pense que le problème vient de là mais je ne le vois pas :S.

La GLIB me donne ce message d'erreur :
(interface:4565): GLib-GObject-WARNING **: invalid (NULL) pointer instance

(interface:4565): GLib-GObject-CRITICAL **: g_signal_connect_data: assertion `G_TYPE_CHECK_INSTANCE (instance)' failed
Je vous montre mon code :

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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#include <stdio.h>
#include <stdlib.h>
#include <gtk/gtk.h>
 
#include "../include/interface.h"
 
#define LIGNES 5
#define COLONNES 5
 
#define BOUTONS 20
#define LARGEUR 360
#define HAUTEUR 450
 
GtkWidget**
initialiser_boutons(char** labels, int nombre)
{
    GtkWidget** boutons = NULL;
    int i;
 
    if ((boutons = malloc(nombre * sizeof(GtkWidget*))))
    {
	for (i = 0; i < nombre; i++)
	{
	    if (!(boutons[i] = gtk_button_new_with_label(labels[i])))
	    {
		fprintf(stderr, "Allocation des boutons impossible\n");
	    }
	}
    }
    else
    {
	fprintf(stderr, "Allocation des boutons impossible\n");
    }
 
    return boutons;
}
 
GtkWidget*
initialiser_table(int lignes, int colonnes, GtkWidget** boutons, int nombre,
		  GtkWidget** textView, GtkTextBuffer** textBuffer)
{
    GtkWidget* table = NULL;
    PangoFontDescription* font = NULL;
    int i;
    int j;
    int k = 0;
 
    table = gtk_table_new(lignes, colonnes, TRUE);
    *textView = gtk_text_view_new_with_buffer(*textBuffer);
    font = pango_font_description_from_string("Serif 20");
    gtk_widget_modify_font(*textView, font);
 
    gtk_table_attach(GTK_TABLE(table), *textView, 0, 5, 0, 1, 
		     GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 10, 10);
    for (i = 1; i < lignes; i++)
    {
	for (j = 0; j < colonnes; j++)
	{
	    gtk_table_attach(GTK_TABLE(table), boutons[k], j, j + 1, i, i + 1,
			     GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 10, 10);
	    k++;
	}
    }
 
    return table;
}
 
GtkWidget*
initialiser_fenetre(int largeur, int hauteur, char* titre, GtkWidget*** boutons,
		    GtkWidget** textView, GtkTextBuffer** textBuffer)
{
    GtkWidget* window = NULL;
    GtkWidget* table = NULL;
    char* nomsLabels[BOUTONS] = {"7", "8", "9", "DEL", " ",
				 "4", "5", "6", " * ", " / ",
				 "1", "2", "3", " + ", " - ",
				 "0", ".", "(-)", " ^ ", " = "};
 
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_default_size(GTK_WINDOW(window), largeur, hauteur);
    gtk_window_set_title(GTK_WINDOW(window), titre);
 
    *boutons = initialiser_boutons(nomsLabels, BOUTONS);
    table = initialiser_table(LIGNES, COLONNES, *boutons, BOUTONS,
			      textView, textBuffer);
    gtk_container_add(GTK_CONTAINER(window), table);
 
    return window;
}
 
void
modifierTextView(GtkWidget* widget, gpointer textView)
{
    const gchar* label = NULL;
    gchar* text = NULL;
    GtkTextBuffer* textBuffer = NULL;
    GtkTextIter start;
    GtkTextIter end;
 
    label = gtk_button_get_label(GTK_BUTTON(widget));
    textBuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textView));
    gtk_text_buffer_insert_at_cursor(textBuffer, label, -1);
    text = gtk_text_buffer_get_text(textBuffer, &start, &end, TRUE);
    printf("%s\n", text);
}
 
int
main(int argc, char* argv[])
{
    GtkWidget* window = NULL;
    GtkWidget* textView = NULL;
    GtkTextBuffer* textBuffer = NULL;
    GtkWidget** boutons = NULL;
    int i;
 
    gtk_init(&argc, &argv);
    g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
 
    window = initialiser_fenetre(LARGEUR, HAUTEUR, "Calculatrice", &boutons,
				 &textView, &textBuffer);
    for (i = 0; i < BOUTONS; i++)
    {
	g_signal_connect(G_OBJECT(boutons[i]), "clicked",
			 G_CALLBACK(modifierTextView), (gpointer) textView);
    }
 
    gtk_widget_show_all(window);
 
    gtk_main();
 
    return 0;
}
C'est un code de test, donc rédiger sans fichier d'en-tête (j'apprends à me servir des bases de GTK+ ;-)).

Voilà si pouviez m'aider, merci à vous.

Bye.