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

开发基于GTK+或QT的应用程序
回复
头像
Skinhead
帖子: 119
注册时间: 2008-09-19 14:54
来自: 哈尔滨
送出感谢: 0
接收感谢: 0
联系:

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

#1

帖子 Skinhead » 2010-10-29 19:00

代码: 全选

/* 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;
}
另外,不能给帖子中的特定代码行添加颜色等格式?
sudo apt-get remove windows...................I do it with Ubuntu!
GodPig
帖子: 240
注册时间: 2007-04-27 23:07
送出感谢: 0
接收感谢: 0

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

#2

帖子 GodPig » 2010-10-30 2:05

每次都输出1?

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

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

我也不懂,只是胡乱猜测的 :em06
头像
i_NIX
帖子: 450
注册时间: 2008-02-11 15:46
送出感谢: 0
接收感谢: 0

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

#3

帖子 i_NIX » 2010-10-31 11:04

代码: 全选

/* 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,可能还好一些。
Google Talk群组,请来<雨云>一番!
主题:UbuntuLinux编程科幻、民主、科学等。
添加 rain-cloud@appspot.com 为好友(然后say hi,并等待验证)
参见 http://goo.gl/xIpxH

Twitter:http://twitter.com/nixzhu
头像
zft19
帖子: 63
注册时间: 2007-12-08 9:05
送出感谢: 0
接收感谢: 1 次

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

#4

帖子 zft19 » 2010-11-13 13:00

楼主需要好好把C语言功力加强一下,尤其是指针那
回复

回到 “GTK+和QT”