星期日, 八月 19, 2007

for循环中iterator不可乱删除



今天写iTalk,想要把空组删除掉。
//tree_store就是列表中的数据(TreeStore)
//下面代码作用是扫描列表中的组,发现空组则删除。
Gtk::TreeModel::Children children = tree_store->children();
Gtk::TreeModel::iterator it_g;
it_g = children.begin();

for (; it_g != children.end(); ++it_g) {
Gtk::TreeModel::Children grandson = it_g->children();
if(grandson.begin()==grandson.end())
{
const Glib::ustring& tmp= (*it_g)[buddyColumns.id];
std::cout<<tmp<<"为空组======================="<<std::endl;
tree_store->erase(it_g);
}
}

不过遇到了段错误。思前想后发现段错误的原因是因为那个删除 tree_store->erase(it_g);
执行了这句后,it_g所指向的数据已经失效,所以it_g++的话就会溢出。
把for 循环改成do while循环,用一个中间变量来得到it_g的值,并用它来删除。

do{
Gtk::TreeModel::Children grandson = it_g->children();
Gtk::TreeModel::iterator point = it_g;
it_g++;
if(grandson.begin()==grandson.end())
{
//const Glib::ustring& tmp= (*point)[buddyColumns.id];
//std::cout<<tmp<<"为空组======================="<<std::endl;
tree_store->erase(point);
}

}
while(it_g!=children.end());
嗯。这样也算是解决问题吧。

星期天闲聊



令人想不到的事。Blogspotc又解封了。这倒没有令人兴喜的。因为偶对于这件事
已经习以为常了。起码不以此为喜,不以此为悲。谁知道它明天是不是又会被封呢。
总不能因此被GFW调着偶的心情吧。
专心于开发 iTalk后就比较少写博了。大概是找到了一个比较固定的玩具吧。有事
做了,就没有那么多唠叨与胡思乱想了。
关于这个 iTalk,我是想把它视频,音频,传文件功能啊,什么的都加进去的。因为在
Linux,这样丰富的聊天程序不多。而一些又不让我满意。于是就有了自己做一个的念头。
第一次做开源项目。的确学习到很多东西。看着iTalk从一个小小的测试程序,只能登录,
到能收发信息,到列表的丰富化。就好像看着自己的宠物成长一样。每实现一个小功能
都兴喜不已。每遇到 一个BUG就忧愁半天。呵呵。
倒是学会子一招。在遇到BUG时,最好放一放,通常我都是轻松一下,过一会再看,才
猛然地发现问题的所在。如果一味地研究,反而跳不出圈圈子。这也算是一种思维方式
吧。虽然以前有人对我说过。不过,还是要自己体会才会深刻。
在此之前,总以为自己做不子项目 。 而且有种程序员洁癖。所谓程序员洁癖,就是指
实现一个功能时,总想着要用最好的代码,最巧妙的方法。不然,就会觉得办法很粗陋,
代码很脏。在写任何代码前,总不自觉会有这种想法。因而总为想一个好的结构,算法
烦恼半天。现在来说,不应该害怕写这种代码。写代码第一要素就是先实现功能。优化
的事留在以后考虑。当然这是对于新手来说的。因为新手不可能一开始就计划好大的结构
。要做开源的程序,就得先把功能搞上去。然后才后考虑优化。当然不是说不要考虑优化
,但那是在力所能及的方面了。


星期五, 八月 10, 2007

如何编译iTalk

前面我已经发过iTalk的截图了。为了让大家有更多的了解,现在发布编译的方法。
声明:由于这是一个开发中的版本,会遇到很多问题,强烈建议您有强壮的心脏和
心理准备来体验您将要做的事。

重要:由于测试的方便,代码里会有一个叫cyclonb...@gmail.com的帐号和密码。我们
希望您不要用这个帐号登录和对这个帐号做密码更改之类的事情,这是我们用于测试用的。
谢谢合作。非常感谢。

iTalk是以gloox为协议基础。所以你必须编译安装好gloox库才能正常编译iTalk,
一般的系统可能已经提供了gloox库。但我强烈建议您卸载它。因为系统所提供的
gloox是一般比较过时。而iTalk所使用的gloox会比较新。因为是处于开发状态,iTalk
和gloox的svn版本变化会比较多。容易出现版本不兼容导致不能编译的结果,这也是
我之前建议您等待我们发布整合版本而不是自己编译的原因。

1.首先从源里取出gloox库的2420版本。(这是iTalk现在使用的版本)

svn co svn://svn.camaya.net/gloox/trunk gloox -r2420

然后是编译安装
cd gloox
./autogen.sh
./configure
make
sudo make install
(如果还有不明白的,请参考http://camaya.net/glooxdownload)

2.然后取出iTalk的源代码。(实际上,iTalk在申请项目名的时候叫geekr,当然关于
名字的问题我们以后再讨论)

svn checkout *http*://geekr.googlecode.com/svn/trunk/ iTalk
进入目录编译:
cd iTalk
./configure
make
sudo make install

现在您可以通过命令行italk来启动程序了。

如果您有好的建议请发到Cyclone_QQ@googlegroups.com邮件列表来。谢谢讨论。

星期二, 八月 07, 2007

libglade中的Notebook控件不要有空页

libglade中的Notebook控件不要有空页

今天在写iTalk的时候。准备加一个显示登录状态时显示的
动画这样的功能。于是在主窗口上加一个NoteBook控件。
准备在登录中显示那个动画的页,登录成功则显示好友列
表的页。

用glade画好Notebook控件后。程序加载后显示有一个警告:

(italk:31101): Gtk-CRITICAL **: gtk_notebook_set_tab_label: assertion `GTK_IS_WIDGET (child)' failed

(http://lists.ximian.com/pipermail/glade-users/2004-August/002014.html)
(查到的资料地址,解决方案)
google一下才知道。这是因为我画的Notebook控件有三页,
而我只用了其中两页。就是有一页为空。而libglademm处理
这个空页时产生的这个警告。只需要去掉这个空页,或者在空
页里随便加一个Vbox控件令它不为空就行了。这问题在Notebook
页设为0时也会出现。这对于libglade也是一样。所以标题用这个。
我看用C和libglade的人会比用C++和libglademm的人多吧。