SERVICE PHONE

13988889999
hashgame hashgame
你的位置: 首页 > hashgame
哈希表在基于GTK_库图形界面开发中的应用HASH GAME - Online Skill Game

发布时间:2025-11-14 19:58:36  点击量:

  hashgame,hashgames,hash game casino,hash game sign up,hash game download/BETHASH GAME [PermaLink: 363050.com] is the largest official cryptocurrency game. Fair and just, 1 second commission return, providing: hashgame,hash game download,BTC, ETH,TRC20,TRX面操作程序具有实时显示机床运作的位置信息、输 入控制机床的程序代码、编辑操作界面、提供一些 对系统底层操作的 API 等功能。 图 1 为已开发出的界面的一个截图。 底部的按钮栏实现的是一个菜单的操作功能, 它有对应的层次结构关系,可以一层层往下跳转, 也可以一层层返回。如下图 2 和图 3 所示。 如在此状态下再按翻页键,可跳转到如下状态。 当达到最底层菜单时,单击对应的按钮,便应 当调用某一函数执行对应的事件,实现诸如设定位 置坐标,移动位置等功能。 如何在底部按钮栏里,如图 2、图 3 所示,反 复的层与页的跳转过程中,找到单击某一层某一页 下的某一个按键所需要执行的函数呢?首先是建 立几个状态变量来标识当前的按钮栏处于哪一层 和哪一个页下,单击了哪一个按钮。于是,把底部 按钮栏的菜单结构分成了 4 层,并对应地设定了 4 个整型变量, 分别是 level_one, level_two, level_ three,level_four。这 4 个变量分别对应地标识 了底部按钮栏第一层、第二层、第三层和第四层的 信息。 在程序中,给以上每一个变量赋一个二位数整 型值。十位数表示所在的页号(按最右边的箭头 button 可切换底部按钮栏的页面) 十位数为零时, , 表明界面尚未跳到此层,为 1 时,表示在此层的第 一个页面,为 2 时,表示在此层的第二个页面,以 此类推。 变量的个位数则标识在此层, 此页状态下,

  在Linux系统下,有一个重要图形界面开发工 具集,这便是GTK+(GIMPToolkit)。它是一个多 平台的开发工具,提供了一个完整的控件集,适用 于使用一套小的控件工具来完成的应用程序或工 程。它支持一系列编程语言,除C/C++以外还包 括如Perl和Python等语言。以前版本的GTK+就被 广泛地应用在各种软件中,包括GNOME桌面环境、 GIMP图像处理程序等。GTK+是自由软件,并且是 GNU工程的一部分,GTK+的许可协议(Biblioteka BaiduGPL)允许任 何开发者使用,包括那些开发中的专利软件且不收 任何费用。GTK+是当今惟一百分之百零付费的工 业级的图形界面开发工具。 哈希表是数据结构中的重要概念之一,由于它 在记录查找时一次存取便能得到所查记录,所以在 对大量功能函数进行查找时,显示出相当高的效 率。在进行图形界面开发的时候,利用哈希表的有 关知识,能给工作带来极大的便利。

  (广州华南理工大学自动化科学与工程学院,广东广州510640) 摘要在 linux 系统下采用 GTK+库进行应用于数控机床的图形界面编程时,一个具体的问题是:当菜单 的层次结构比较复杂,单击了某一层次的某个菜单按钮后,如何找到对应所需要执行的功能函数?针对此问题, 笔者提出了一个解决方法,此方法利用了数据结构中的哈希表来存储函数指针,通过哈希表的查找,可以成功地 实现功能函数的调用。 关键词哈 希 表 , GTK+, Linux, 数 控 机 床 , 图 形 界 面 。 中图分类号TP317.4

  建立信号连接的语句:g_signal_connect(G_OBJE- CT(button2),clicked”,G_CALLBACK(call_back), 上 面 的 语 句 把 voidcall_back(GtkWidget* widget,intbutton_number)作为传递给图 4 中 “工 作”按钮的回调函数。此函数内又调用了其他几个 函数,主要有 change_state()和 find_execute() 函数。change_state()函数负责改变状态变量值, 在图 4 中是把 level_two 的值改成 22, 表明是第二 个按钮按了下去。接着调用 find_execute()函数, 此函数利用传递给它的 4 个状态参数实现对哈希表 的查找,并利用查找所得函数指针来调用函数。以 下是 find_execute()函数的编写实现: voidfind_execute(int&one, int&two, int&three,int&four) { unsignedlonginttemp; void(*my_function)(int&one,int& two,int&three,int&four);//定义某一类型的 函数指针 charkey_name[20]; temp=one *1000000+two*10000+three*100+four; sprintf(key_name,“%u”,temp);//把 temp 转换成字符串并赋给 key_name,即某 key 值 my_function=(void(*)(int&one,int&two, int&three,int&four)(g_hash_table_lookup (hash_table,gconstpointer(key_name))); //在哈希表中查找数据,并把数 据强制转换为函数指针类型的值 if(my_function==NULL){return;} my_function(one,two,three,four);//执 行 my_function 所指向的函数 } 函数首先把传递给它的 4 个状态变量参数,即 level_one,level_two,level_three,level_four4 个状态变量的值连起来形成一个字符串,形成一个 Key 值,再通过此 Key 值在哈希表里面找到所需要 处理的函数的指针,并把此指针赋给了一个函数指 针变量 my_function。最后,还是以 level_one, 7 电子科技/2004 年 5 月 15

  按了哪一个按钮。图 2、图 3 为此作了一个流程示 例分析, 并把 evel_one, level_two, level_three, level_four 这 4 个变量的改变情况标明在右边。 从 图中可以清楚地看到这 4 个变量的改变情况。 有了这 4 个状态变量,便可知当前是单击了哪 一层下哪个页面的哪个按钮了。以 level_one=12, level_two=22,level_three=0,level_four=0 的 状态为例:据 level_one=12 的信息,可知道是由 第一层的第一页第二个按钮进入到了第二层,而据 level_two=22,level_three=0 的信息,可知道目 前是单击了第二层第二页的第二个按钮。 状态标识变量设立之后,可根据这 4 个状态变 量找到所需执行的函数。方法为编写判断程序代 码,即利用一大堆 if、switch 语句来找到所要执 行的函数。但这样以来,对于拥有 4 个层次的结构 和每层 7 个按钮情况而言, 要遍举所有的可能情况, 理论上会有 7×7×7×7 这么多的状态,这是令人 难以接受的。 在 GTK+库所属的 glib 库里面,提供给了一个 建立和查找哈希表的功能,这使得从编写大量判断 语句的工作中解脱出来,轻松地把每一个单击某一 按钮后所需执行的某一函数的指针作为一个数据 量,存放于哈希表中。这样,当单击了某一按钮之 后, 就可以把 level_one, level_two, level_three, level_four 这 4 个变量作为参数传递给 glib 里面 的哈希表查找函数,利用此查找函数返回所需调用 的函数的指针。

  在图 4 中,单击了“工作”按钮之后,状态变 量的值为:level_one=12,level_two=22,level_ three=0, level_four=0。 建立 Key 值 “12220000” , 对应要存储其地址的函数为 voidpos_12220000 (int&one,int&two,int&three,int&four)。

  笔者的设计目标是在 linux 操作系统下开发出 用于实际操作数控机床的一套界面操作程序,该界

  *基金项目:广东省科学技术厅重点科技攻关项目 (项目编号:2002A1040402) 收稿日期:2004-03-28

  Glib 库是由 GTK+频繁使用的流行函数组成的 集合。链接表、树、错误处理、内存管理和计时器 等都是库内容的一部分。其地位可类似于 C 语言的 标准函数库。下面介绍在 glib 库中所要使用的 GhashTable(哈希表) 。 GHashTable 是 glib 里的一个简单的哈希表实 现。哈希表里每一个单元对应存储了一个键值 Key 和一个数据量 Value。要使用哈希表,必须提供一 个 GhashFunc 函数,当向它传递一个键值的时候, 它会返回一个 guint 型正整数值。返回的每个 guint 数值便是对应于存储在哈希表中的数据的位 置信息,通过此信息,就可以对对应某一 Key 值的 数据进行操作。但是仅仅有了 GhashFunc 还是不够 的,因为有时候不同的 Key 值通过 GhashFunc 计算 后返回得到的可能是同一个 guint 值,也就是发生 哈希值冲突。因此,还需要一个 GcompareFunc 比 较函数用来测试关键字是否相等。在 GHashTable 中可以将 GcompareFunc 看作是等式操作符,如果 参数是相等的,则返回 TRUE。这样,当哈希冲突导 致在相同的“哈希表元”中有多个关键字对应一个 GhashFunc 计算后的返回值时,此键比较函数用来 找到正确的数据。 取图 3 里面中间的那个状态作为图 4,来讲述 在界面编程中,哈希表的具体应用。 首先把 level_one,level_two,level_three, level_four 四个状态变量的值连起来形成一个字 符串,作为一个 Key 值,把所需要处理的函数的指 针作为数据量存于哈希表。

  在哈希表中,GhashFunc 编写如下: guinthash_function(gconstpointerkey) //GhashFunc 的编写 { char*endptr;

  unsignedlongtemp; guinttemp_int; //把字符串转换成无符号长整型变量 temp_int=guint((temp/10000)*10)+ guint(temp%10000);//用折叠法来取哈希值 returntemp_int; } 从上面代码可知,此 hash_function 的功能便 是把类似于“12220000”这样的字符串型 Key 值转 换成某一对应的 guint 型值,并返回它。 GcompareFunc 的编写如下: gbooleanhash_compare(gconstpointer name1,gconstpointername2) { return(!strcmp((char*)name1,(char*)nam hash_compare 函数的功能便是简单地比较两 个字符串的异同。 利用以上 hash_function 和 hash_compare 函 数,即可建立起一个哈希表。下面是建立哈希表, 并以函数指针作为数据量存入表中的过程(当然, 必须首先定义所存入的 pos_12220000 这个函数) : hash_table=g_hash_table_new(hash_func- tion,hash_compare); g_hash_table_insert(hash_table,(void*) “12220000”,(void*)pos_12220000); 建立了哈希表之后,再来详叙如何利用了哈希 表来实现不同单击事件的处理过程。 首先,必须为按钮栏里面的每一个 button 构 件建立一个回调函数,此回调函数在接收到按键的 clicked 消息后进行对应处理。GTK+提供了如下一 个函数来实现信号处理。 gulongg_signal_connect(gpointer*object, constgchar*name,GCallbackfunc,gpointer func_data); 第一个参数是要发出信号的构件,第二个参数 是你想要连接的信号的名称,第三个参数是信号被 捕获时所要调用的函数,第四个参数是你想传递给 这个函数的数据。以下是为第二个按钮(button2) e2));}

地址:广东省广州市  电话:020-66889888 手机:13988889999
Copyright © 2012-2025 HASH GAME(哈希游戏) 版权所有 非商用版本 ICP备案编: