PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem bei der Ausführung meines GTK+ Programms!



Preston2k3
28-08-2003, 19:56
Hi,
ich möchte einen GTK+ Tree erstellen! Nur bricht das Programm (laut meinen Erkenntnissen) bei der Zeile

gtk_widget_show (onlinesubitem);

ab. Ich bekomme einen "Segmentation Fault" Error! Woran könnte das liegen? Hier ist der ganze Code meines Trees (es ist nicht der vollständige Programmcode):

#define GTK_ENABLE_BROKEN

#include <gtk/gtk.h>
#include <stdio.h>
#include <string.h>
#include "buddy_check.h"

/* for all the GtkItem:: and GtkTreeItem:: signals */
static void cb_itemsignal( GtkWidget *item,
gchar *signame )
{

}

/* Note that this is never called */
static void cb_unselect_child( GtkWidget *root_tree,
GtkWidget *child,
GtkWidget *subtree )
{

}

/* Note that this is called every time the user clicks on an item,
whether it is already selected or not. */
static void cb_select_child (GtkWidget *root_tree, GtkWidget *child,
GtkWidget *subtree)
{

}

static void cb_selection_changed( GtkWidget *tree )
{

}

void buddy_list_tree( GtkWidget *fenster )
{
GtkWidget *tree;
char *online = "Online";
char *offline = "Offline";
FILE *contactfile;
GtkWidget *onlinesubitem;
GtkWidget *offlinesubitem;
GtkWidget *onlinesubtree;
GtkWidget *offlinesubtree;
GtkWidget *item;
GtkWidget *item2;
char *nickname;
int i;

tree = gtk_tree_new ();

g_signal_connect (G_OBJECT (tree), "select_child",
G_CALLBACK (cb_select_child), tree);
g_signal_connect (G_OBJECT (tree), "unselect_child",
G_CALLBACK (cb_unselect_child), tree);
g_signal_connect (G_OBJECT(tree), "selection_changed",
G_CALLBACK(cb_selection_changed), tree);

gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (fenster),
tree);

gtk_tree_set_selection_mode (GTK_TREE (tree),
GTK_SELECTION_MULTIPLE);

gtk_tree_set_view_lines(tree,FALSE);
gtk_widget_show (tree);

item = gtk_tree_item_new_with_label (online);

g_signal_connect (G_OBJECT (item), "select",
G_CALLBACK (cb_itemsignal), "select");
g_signal_connect (G_OBJECT (item), "deselect",
G_CALLBACK (cb_itemsignal), "deselect");
g_signal_connect (G_OBJECT (item), "toggle",
G_CALLBACK (cb_itemsignal), "toggle");
g_signal_connect (G_OBJECT (item), "expand",
G_CALLBACK (cb_itemsignal), "expand");
g_signal_connect (G_OBJECT (item), "collapse",
G_CALLBACK (cb_itemsignal), "collapse");

gtk_tree_append (GTK_TREE (tree), item);

gtk_widget_show (item);





onlinesubtree = gtk_tree_new ();

g_signal_connect (G_OBJECT (onlinesubtree), "select_child",
G_CALLBACK (cb_select_child), onlinesubtree);
g_signal_connect (G_OBJECT (onlinesubtree), "unselect_child",
G_CALLBACK (cb_unselect_child), onlinesubtree);

gtk_tree_set_selection_mode (GTK_TREE (onlinesubtree),
GTK_SELECTION_SINGLE);

gtk_tree_set_view_mode (GTK_TREE (onlinesubtree), GTK_TREE_VIEW_ITEM);

gtk_tree_item_set_subtree (GTK_TREE_ITEM (item), onlinesubtree);





item2 = gtk_tree_item_new_with_label (offline);

g_signal_connect (G_OBJECT (item2), "select",
G_CALLBACK (cb_itemsignal), "select");
g_signal_connect (G_OBJECT (item2), "deselect",
G_CALLBACK (cb_itemsignal), "deselect");
g_signal_connect (G_OBJECT (item2), "toggle",
G_CALLBACK (cb_itemsignal), "toggle");
g_signal_connect (G_OBJECT (item2), "expand",
G_CALLBACK (cb_itemsignal), "expand");
g_signal_connect (G_OBJECT (item2), "collapse",
G_CALLBACK (cb_itemsignal), "collapse");

gtk_tree_append (GTK_TREE (tree), item2);

gtk_widget_show (item2);




offlinesubtree = gtk_tree_new ();


g_signal_connect (G_OBJECT (offlinesubtree), "select_child",
G_CALLBACK (cb_select_child), offlinesubtree);
g_signal_connect (G_OBJECT (offlinesubtree), "unselect_child",
G_CALLBACK (cb_unselect_child), offlinesubtree);

gtk_tree_set_selection_mode (GTK_TREE (offlinesubtree),
GTK_SELECTION_SINGLE);

gtk_tree_set_view_mode (GTK_TREE (offlinesubtree), GTK_TREE_VIEW_ITEM);

gtk_tree_item_set_subtree (GTK_TREE_ITEM (item2), offlinesubtree);

contactfile = fopen("ftp-tmp/CONTACT_LIST","r");

if (contactfile != NULL)
{
while(!feof(contactfile))
{
fgets(nickname, 64 ,contactfile);
for (i = 0; i < strlen(nickname); i++) if (nickname[i] == '\n') { nickname[i] = '\0'; break; }
if (buddy_list_check(nickname))
{
onlinesubitem = gtk_tree_item_new_with_label (nickname);
g_signal_connect (G_OBJECT (onlinesubitem), "select",
G_CALLBACK (cb_itemsignal), "select");
g_signal_connect (G_OBJECT (onlinesubitem), "deselect",
G_CALLBACK (cb_itemsignal), "deselect");
g_signal_connect (G_OBJECT (onlinesubitem), "toggle",
G_CALLBACK (cb_itemsignal), "toggle");
g_signal_connect (G_OBJECT (onlinesubitem), "expand",
G_CALLBACK (cb_itemsignal), "expand");
g_signal_connect (G_OBJECT (onlinesubitem), "collapse",
G_CALLBACK (cb_itemsignal), "collapse");

gtk_tree_append (GTK_TREE (onlinesubtree), onlinesubitem);
gtk_widget_show (onlinesubitem);
}

else
{
offlinesubitem = gtk_tree_item_new_with_label (nickname);

g_signal_connect (G_OBJECT (offlinesubitem), "select",
G_CALLBACK (cb_itemsignal), "select");
g_signal_connect (G_OBJECT (offlinesubitem), "deselect",
G_CALLBACK (cb_itemsignal), "deselect");
g_signal_connect (G_OBJECT (offlinesubitem), "toggle",
G_CALLBACK (cb_itemsignal), "toggle");
g_signal_connect (G_OBJECT (offlinesubitem), "expand",
G_CALLBACK (cb_itemsignal), "expand");
g_signal_connect (G_OBJECT (offlinesubitem), "collapse",
G_CALLBACK (cb_itemsignal), "collapse");

gtk_tree_append (GTK_TREE (offlinesubtree), offlinesubitem);
gtk_widget_show (offlinesubitem);
}

}
}
}

An meinen eigenen Funktionen kann es eigentlich nicht liegen, die habe ich nämlich an anderen Beispielen getestet! Ich hoffe ihr könnt mir helfen!

MFG Preston2k3

anda_skoa
28-08-2003, 20:46
Gibt den Code in code Tags statt in Kursiv.

bei so langem Code wird es sonst mühsam.

Ciao,
_

Trillian
28-08-2003, 20:59
1.) GtkTree ist noch aus GTK 1.2, oder? Nimm GtkTreeModel, GtkTreeView etc. GtkTree-Support wird vermutlich bald aus GTK2 rausgeschmissen
2.) Wenn du dir nicht sicher bist, wo er abstürzt, benutzt einen Debugger (gdb z.B., valgrind ist auch nett, aber mit GTK nur bedingt nützlich)
3.) mmh, hab ich vergessen :p

Preston2k3
02-09-2003, 20:43
Es liegt an der Stelle! Zumindest meint der Debugger das! Nur sind die GTK Tree Möglichkeiten in GTK+2 zu komplex und so konnte ich sie nicht in meinen Code einbinden. Wüsstet ihr eine andere Lösung für dieses Problem?

MFG Preston2k3