当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 4 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : gtk+之全局变量——运行书上的范例,运行结果却令人费解
帖子发表于 : 2010-10-29 19:00 
头像

注册: 2008-09-19 14:54
帖子: 119
地址: 哈尔滨
送出感谢: 0 次
接收感谢: 0 次
代码:
/* 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!


页首
 用户资料  
 
2 楼 
 文章标题 : Re: gtk+之全局变量——运行书上的范例,运行结果却令人费解
帖子发表于 : 2010-10-30 2:05 

注册: 2007-04-27 23:07
帖子: 240
送出感谢: 0 次
接收感谢: 0 次
每次都输出1?

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

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

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


页首
 用户资料  
 
3 楼 
 文章标题 : Re: gtk+之全局变量——运行书上的范例,运行结果却令人费解
帖子发表于 : 2010-10-31 11:04 
头像

注册: 2008-02-11 15:46
帖子: 450
送出感谢: 0 次
接收感谢: 0 次
代码:
/* 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


页首
 用户资料  
 
4 楼 
 文章标题 : Re: gtk+之全局变量——运行书上的范例,运行结果却令人费解
帖子发表于 : 2010-11-13 13:00 
头像

注册: 2007-12-08 9:05
帖子: 63
送出感谢: 0 次
接收感谢: 1
楼主需要好好把C语言功力加强一下,尤其是指针那


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 4 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 2 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译