分页: 1 / 1

gtk+之全局变量——运行书上的范例,运行结果却令人费解

发表于 : 2010-10-29 19:00
Skinhead

代码: 全选

/* hello程序 hello.c */
#include <gtk/gtk.h>
gint count = 1;
void
on_button_clicked	(GtkWidget *button, gpointer userdata){
	g_print("你好,这是Hello功能的测试.   ");
	//g_print("Hello. This is a test .  ");


/* 下面这一行的输出始终不变,哪位大哥给解释以下 */
	g_print("%d\n", (gint)userdata);


	//g_print("%d\n", count);
	count = count + 1;
}
int main ( int argc, char *argv[]){
	GtkWidget *window;
	GtkWidget *button;
	gtk_init(&argc, &argv);
	window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
	g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(gtk_main_quit), NULL);

	gtk_window_set_title(GTK_WINDOW(window), "Hello功能实现");
	gtk_window_set_default_size(GTK_WINDOW(window), 500, 100);
	gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
	gtk_container_set_border_width(GTK_CONTAINER(window), 40);
	button = gtk_button_new_with_label("按下此按钮会在终端上显示一行信息");
	g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(on_button_clicked), (gpointer)count);
	gtk_container_add(GTK_CONTAINER(window), button);
	gtk_widget_show(button);
	gtk_widget_show(window);
	gtk_main();

	return FALSE;
}
另外,不能给帖子中的特定代码行添加颜色等格式?

Re: gtk+之全局变量——运行书上的范例,运行结果却令人费解

发表于 : 2010-10-30 2:05
GodPig
每次都输出1?

这样的话,说明
g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(on_button_clicked), (gpointer)count);
把count作为形参传进去了,你再在外面改变count的值是影响不到里面的数据的

这个你改成&count
然后打印的时候使用 g_print("%d\n", *count);试试

我也不懂,只是胡乱猜测的 :em06

Re: gtk+之全局变量——运行书上的范例,运行结果却令人费解

发表于 : 2010-10-31 11:04
i_NIX

代码: 全选

/* hello程序 hello.c */
#include <gtk/gtk.h>
gint count = 1;
void
on_button_clicked   (GtkWidget *button, gpointer userdata){
   g_print("你好,这是Hello功能的测试.   ");
   //g_print("Hello. This is a test .  ");


/* 下面这一行的输出始终不变,哪位大哥给解释以下 */
   g_print("%d\n", *((int *)(userdata)) );


   //g_print("%d\n", count);
   count = count + 1;
}
int main ( int argc, char *argv[]){
   GtkWidget *window;
   GtkWidget *button;
   gtk_init(&argc, &argv);
   window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
   g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(gtk_main_quit), NULL);

   gtk_window_set_title(GTK_WINDOW(window), "Hello功能实现");
   gtk_window_set_default_size(GTK_WINDOW(window), 500, 100);
   gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
   gtk_container_set_border_width(GTK_CONTAINER(window), 40);
   button = gtk_button_new_with_label("按下此按钮会在终端上显示一行信息");
   g_signal_connect(G_OBJECT(button), "clicked", 
   						G_CALLBACK(on_button_clicked), (gpointer)&count);
   gtk_container_add(GTK_CONTAINER(window), button);
   gtk_widget_show(button);
   gtk_widget_show(window);
   gtk_main();

   return FALSE;
}
2楼讲的基本对,只是在打印时,要先将gpointer转成(int *)类型的指针,再用*号取指针的值。
代码里有表现,自己看就懂了,再编译运行就对了。

再有一点,不知道LZ看的什么人写的书?建议扔掉。
其实指针这些东西应该找专门的C语言书来学,GTK+的书属于应用而已。国人编写的估计就会有很多错误。

因为GTK+是有多种语言绑定的,不如你试试pygtk,可能还好一些。

Re: gtk+之全局变量——运行书上的范例,运行结果却令人费解

发表于 : 2010-11-13 13:00
zft19
楼主需要好好把C语言功力加强一下,尤其是指针那