﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-_ n a _ g _ _ _-随笔分类-~/development</title><link>http://www.cppblog.com/dingounan/category/4740.html</link><description>If you want something done right,do it yourself.</description><language>zh-cn</language><lastBuildDate>Sat, 31 May 2008 12:36:12 GMT</lastBuildDate><pubDate>Sat, 31 May 2008 12:36:12 GMT</pubDate><ttl>60</ttl><item><title>小成功</title><link>http://www.cppblog.com/dingounan/archive/2008/05/31/51666.html</link><dc:creator>Don</dc:creator><author>Don</author><pubDate>Fri, 30 May 2008 23:58:00 GMT</pubDate><guid>http://www.cppblog.com/dingounan/archive/2008/05/31/51666.html</guid><wfw:comment>http://www.cppblog.com/dingounan/comments/51666.html</wfw:comment><comments>http://www.cppblog.com/dingounan/archive/2008/05/31/51666.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dingounan/comments/commentRss/51666.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dingounan/services/trackbacks/51666.html</trackback:ping><description><![CDATA[今天用select手写main loop程式片段,成功.<br>类比GMainLoop,GMainContext大概就是fd_set,GSource是file descriptor.<br>整合了XEvent和一个custom event source(socket).不过,与网上的那些帖子比起来,我没有加上XProcessInternalConnection也行,不知道这是什么原因.另外,我没有加入XAddConnectionWatch的callback,也就是说,我没有记录XLib的Internal Connection File Descriptor.我想,Internal Connection是不是指input method of asian language那一类程序建立的链接呢?<br>XProcessInternalConnection这个东西的作用还是要进一步考察. 
<img src ="http://www.cppblog.com/dingounan/aggbug/51666.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dingounan/" target="_blank">Don</a> 2008-05-31 07:58 <a href="http://www.cppblog.com/dingounan/archive/2008/05/31/51666.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>线索</title><link>http://www.cppblog.com/dingounan/archive/2008/05/30/51558.html</link><dc:creator>Don</dc:creator><author>Don</author><pubDate>Fri, 30 May 2008 01:13:00 GMT</pubDate><guid>http://www.cppblog.com/dingounan/archive/2008/05/30/51558.html</guid><wfw:comment>http://www.cppblog.com/dingounan/comments/51558.html</wfw:comment><comments>http://www.cppblog.com/dingounan/archive/2008/05/30/51558.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dingounan/comments/commentRss/51558.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dingounan/services/trackbacks/51558.html</trackback:ping><description><![CDATA[刚才在睡前重新考虑那些程序的细节问题.注意力集中在XFlush上.<br>我对从X File Descriptor读取的数据测试了一下,发现传回来的已读取bytes竟然为0!而一个正常的XEvent structure大小为96bytes.<br>注意到XLib Manual上的Concepts那一章有一张图,暗指X在运作过程中有两个queue,一个位于Server端,另一个位于Client端,我想,XConnectionNumber传回来的File Descriptor就是套接在Server Event Queue端的.<br>而XFlush是干什么的呢?它不仅把本地的request buffer中的request刷到server那里,而且它还把server event queue中的数据刷到local(client) event queue中来.这样的结果就是,我注册的GSource刚刚在G_IO_IN情况下被触发,XFlush就把数据卷走了(卷到client event queue那里了).所以就导致我读取的bytes数总是0.XProcessInternalConnection也是属于XFlush之流.<br>我以为XSync只是刷本地的request buffer,而不卷server event queue的数据,试了一下,不行.看来XSync不是我所理解的那样运作.<br>我想,解决办法只有两种:1.想办法得到Client Event Queue的File Descriptor.2.老老实实的用select(),然后再XPending,XNextEvent...<br><br>估计第一种不太可能.第二种的话,争取还是使用GLib中的GMainLoop+GIOChannel,否则就要自己手写应用select()的程式片段.
<img src ="http://www.cppblog.com/dingounan/aggbug/51558.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dingounan/" target="_blank">Don</a> 2008-05-30 09:13 <a href="http://www.cppblog.com/dingounan/archive/2008/05/30/51558.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XLib Event Process的File Descriptor方法(未实现)</title><link>http://www.cppblog.com/dingounan/archive/2008/05/29/51525.html</link><dc:creator>Don</dc:creator><author>Don</author><pubDate>Thu, 29 May 2008 14:23:00 GMT</pubDate><guid>http://www.cppblog.com/dingounan/archive/2008/05/29/51525.html</guid><wfw:comment>http://www.cppblog.com/dingounan/comments/51525.html</wfw:comment><comments>http://www.cppblog.com/dingounan/archive/2008/05/29/51525.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dingounan/comments/commentRss/51525.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dingounan/services/trackbacks/51525.html</trackback:ping><description><![CDATA[<p>估计最近搞不出来了,暂时放下,以后有时间再弄.目前继续使用XPending+Message Loop.<br>最后一次实验的结果如下:<br><br>1.我已经能正确链接到DISPLAY的File Descriptor,也能够截取到XEvent.但是,不能正确解读XEvent中的信息.比如说,event.type.我看到有一些帖子说,要使用XProcessInternalConnection将读取的数据转成XEvent格式,但我还是得不出正确结果.<br><br>2.看起来,XLib在运作中并不是只有一个File Descriptor在传送数据.XAddConnectionWatch在每一次产生新的Connection的时候都会使用注册进去的Callback.我看到有很多帖子都使用了这个函式.然后对得到的File Descriptor进行select().<br><br>3.Internal Connection<br>我不清楚这个概念是不是也在传送XEvent?我没有实验.<br><br>4.X基于C/S的设计,务必使用XFlush强制发送停留在local buffer里的request.切记!切记!!<br>(XNextEvent会自动调用)</p>
<br><a href="http://groups.google.com/group/comp.windows.x/topics?lnk=sg" target=_blank>comp.window.x</a>&nbsp;:X Window系统的新闻组,我从那里得到大部分信息.
<img src ="http://www.cppblog.com/dingounan/aggbug/51525.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dingounan/" target="_blank">Don</a> 2008-05-29 22:23 <a href="http://www.cppblog.com/dingounan/archive/2008/05/29/51525.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>5/29/2008工作记录</title><link>http://www.cppblog.com/dingounan/archive/2008/05/29/51471.html</link><dc:creator>Don</dc:creator><author>Don</author><pubDate>Thu, 29 May 2008 06:21:00 GMT</pubDate><guid>http://www.cppblog.com/dingounan/archive/2008/05/29/51471.html</guid><wfw:comment>http://www.cppblog.com/dingounan/comments/51471.html</wfw:comment><comments>http://www.cppblog.com/dingounan/archive/2008/05/29/51471.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dingounan/comments/commentRss/51471.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dingounan/services/trackbacks/51471.html</trackback:ping><description><![CDATA[<div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">果然是Sleepless,足足耗费了我10+小时,丢人...</div>
<div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">在这里总结一下遇到的问题.都是细节.</div>
<div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">关于GLib本身,并没有什么难的地方.像GIOChannel,GMainLoop,这两个我一直大量使用的组件的文档都是相当的详细.而之所以耗费那么长时间,是因为我尝试使用GLib Command Line Parser.这个东西位于Utility中.</div>
<div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">我的想法是,在服务器建立connection的时候,可以通过command line来选择ip,port.最后要具有类似这样的语法:</div>
<div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"><br></div>
<div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">$./Server --address 127.0.0.1 --port 8080</div>
<div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"><br></div>
<div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">我看到在Advanced Programming in the Unix Environment上介绍说sin_port的类型是uint16_t,于是我就把用来接收端口值的那个变量类型设置成了guint16,到这里都是没有问题的.</div>
<div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">然后在解析command line的时候使用G_OPTION_ARG_INT,结果就导致segment fault.</div>
<div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">鉴于GLib在解析的command line argument的时候,对于integer类型,只有一种flag可选,即G_OPTION_ARG_INT,所以在设定port变量类型的时候务必将其设置成gint.而后在写入sin_port的时候再(guint16)port.</div>
<div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"><br></div>
<div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">通过这件事情,有如下教训:</div>
<div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">1.使用GCC的时候,务必加编译选项: -Wall,用以显示所有警告.可以省去你很多GDB时间.大多数情况下,像Variable Type,或是Name Crash引起的问题都可以捕捉到.</div>
<div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">2.类似scanf,sscanf这一类,也有这样变量类型的问题,一样的segment fault.</div>
<div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">&nbsp;&nbsp; 举例:short n;scanf("%d",&amp;n);</div>
<div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">&nbsp;&nbsp; 这样做必定会给你一个segment fault.正确的做法是:</div>
<div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">&nbsp;&nbsp; short n;scanf("%hd",&amp;n);<br></div>
<div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"><br>在这里贴上代码:<br><a href="http://uploader.polorix.net//files/258/code/Socket_test.tar.gz" target=_blank>只使用Unix Socket</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://uploader.polorix.net//files/258/code/GLib_Socket_test.tar.gz" target=_blank>使用GLib+Socket</a><br></div>
<div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">(为了方便其他遇到此类问题的人,下面列了一堆关键字,提高搜索命中率)</div>
<div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">g_option_context_parse;segment fault;倒转顺序 正常 有关;G_OPTION_ARG_STRING</div>
<img src ="http://www.cppblog.com/dingounan/aggbug/51471.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dingounan/" target="_blank">Don</a> 2008-05-29 14:21 <a href="http://www.cppblog.com/dingounan/archive/2008/05/29/51471.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Sleepless in X</title><link>http://www.cppblog.com/dingounan/archive/2008/05/28/51436.html</link><dc:creator>Don</dc:creator><author>Don</author><pubDate>Wed, 28 May 2008 14:42:00 GMT</pubDate><guid>http://www.cppblog.com/dingounan/archive/2008/05/28/51436.html</guid><wfw:comment>http://www.cppblog.com/dingounan/comments/51436.html</wfw:comment><comments>http://www.cppblog.com/dingounan/archive/2008/05/28/51436.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dingounan/comments/commentRss/51436.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dingounan/services/trackbacks/51436.html</trackback:ping><description><![CDATA[发现X是如此精巧的设计.<br><br>前些天想把X server分发的XEvent传送到GLib的GMainLoop里,结合GIOChannel统一处理.困难在于无法得到DISPLAY的File Descriptor.<br>于是Search.得知X Server在6000+DISPLAY上面架设服务,并且以前有人做过用TCP协议访问X Server;又顺便了解了Unix-Domain Socket这种东西.就在我将要试验TCP连接X的时候,我发现了这个东西:<br><br>XConnectionNumber<br><br>它无数次在我眼前晃过.我从第一眼看到它,就一直以为它会传回X Server上的链接数量.那个"Number"狠狠的误导了我.<br><br>实际上,它传回的是XOpenDisplay之后得到的File Descriptor.<br><br>这几天光搜索帖子了,没写多少代码.从现在开始写吧.<br>1.XLib+OpenGL程序框架.(完成)<br>2.Socket on Unix 练习.(完成)<br>3.Socket with GLib 练习.<br>4.GLib+XEvent 练习.<br>5.GLib+XEvent+OpenGL 练习.<br><br>明天可能会把所有遇到的问题再总结一遍.要看进度.<br><br> <img src ="http://www.cppblog.com/dingounan/aggbug/51436.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dingounan/" target="_blank">Don</a> 2008-05-28 22:42 <a href="http://www.cppblog.com/dingounan/archive/2008/05/28/51436.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GLib备忘</title><link>http://www.cppblog.com/dingounan/archive/2008/05/06/48950.html</link><dc:creator>Don</dc:creator><author>Don</author><pubDate>Mon, 05 May 2008 19:28:00 GMT</pubDate><guid>http://www.cppblog.com/dingounan/archive/2008/05/06/48950.html</guid><wfw:comment>http://www.cppblog.com/dingounan/comments/48950.html</wfw:comment><comments>http://www.cppblog.com/dingounan/archive/2008/05/06/48950.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dingounan/comments/commentRss/48950.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dingounan/services/trackbacks/48950.html</trackback:ping><description><![CDATA[今天试验,GLib.<br>IOChannel部分.File Descriptor的'1'被保留下来作为stdout.所以想当然的想统一用如下的代码:<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">&nbsp;1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">stdio.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">glib.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">glib</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">gprintf.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #000000"><img id=Codehighlighter1_94_339_Open_Image onclick="this.style.display='none'; Codehighlighter1_94_339_Open_Text.style.display='none'; Codehighlighter1_94_339_Closed_Image.style.display='inline'; Codehighlighter1_94_339_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_94_339_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_94_339_Closed_Text.style.display='none'; Codehighlighter1_94_339_Open_Image.style.display='inline'; Codehighlighter1_94_339_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;argc,</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;argv[])</span><span id=Codehighlighter1_94_339_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_94_339_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;gsize&nbsp;bytes_written;<br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;GIOChannel&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">output</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">g_io_channel_win32_new_fd(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;g_io_channel_write_chars(output,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">This&nbsp;is&nbsp;a&nbsp;test.\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">bytes_written,NULL);<br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">bytes&nbsp;written:&nbsp;%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,bytes_written);<br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;g_io_channel_flush(output,NULL);<br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
但是,输出的结果是:<br>
<fieldset>bytes written: 16<br>This is a test.</fieldset><br>由此可知,GLib使用IOChannel套接到了File Descriptor 1上,但是,和C runtime使用不同的buffer.<br><br>最好还是统一使用GLib系列的程式.<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">&nbsp;1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">stdio.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">glib.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">glib</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">gprintf.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #000000"><img id=Codehighlighter1_94_341_Open_Image onclick="this.style.display='none'; Codehighlighter1_94_341_Open_Text.style.display='none'; Codehighlighter1_94_341_Closed_Image.style.display='inline'; Codehighlighter1_94_341_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_94_341_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_94_341_Closed_Text.style.display='none'; Codehighlighter1_94_341_Open_Image.style.display='inline'; Codehighlighter1_94_341_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;argc,</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;argv[])</span><span id=Codehighlighter1_94_341_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_94_341_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;gsize&nbsp;bytes_written;<br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;GIOChannel&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">output</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">g_io_channel_win32_new_fd(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;g_io_channel_write_chars(output,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">This&nbsp;is&nbsp;a&nbsp;test.\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">bytes_written,NULL);<br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;g_io_channel_flush(output,NULL);<br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;g_printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">bytes&nbsp;written:&nbsp;%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,bytes_written);<br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<img src ="http://www.cppblog.com/dingounan/aggbug/48950.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dingounan/" target="_blank">Don</a> 2008-05-06 03:28 <a href="http://www.cppblog.com/dingounan/archive/2008/05/06/48950.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>机器人小组,Lego积木,我的高中</title><link>http://www.cppblog.com/dingounan/archive/2008/02/17/42855.html</link><dc:creator>Don</dc:creator><author>Don</author><pubDate>Sun, 17 Feb 2008 15:31:00 GMT</pubDate><guid>http://www.cppblog.com/dingounan/archive/2008/02/17/42855.html</guid><wfw:comment>http://www.cppblog.com/dingounan/comments/42855.html</wfw:comment><comments>http://www.cppblog.com/dingounan/archive/2008/02/17/42855.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dingounan/comments/commentRss/42855.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dingounan/services/trackbacks/42855.html</trackback:ping><description><![CDATA[<p>我的高中,在机器人小组三年,以Lego积木为伴三年.<br>今天再次拿起积木,重新实现以前因为比赛而没有完成的"小"计划 :)<br>记得那时足球比赛,为了那些机器人的程序加了点班,比较疲劳,就偷闲看动画片"超能勇士",在里面,原始兽基地旁边的那种自动防御火炮很好,很可靠;羡慕死我了.<br>今天,就仿制那种火炮.只用原版Lego积木!!(不改造,不用502,不用螺丝)<br>当然,不能用火药.所以发射部分就用弩机.今天只完成一点点:自动拉弓,以及发射导轨.(明天再去学校照个相传上来)<br>进度还算可以,不过还是浪费了不少时间在导轨上,主要就是弩机对强度要求比较大,拉弓的时候对导轨的要求十分的高,而且导轨还要与主枪体分离...很难让它稳定下来啊...明天就传上来图,估计看起来还是特别粗糙.<br>扳机将会是最难的一部分了,因为要在那上面安装马达.看明天能不能解决了...</p>
----------------------------------------------------------<br>edit:<br>这是昨天最后的图片.<br><a href="http://uploader.polorix.net//files/258/picture/20080218044.jpg" target=_blank>picture1</a>&nbsp;&nbsp;<a href="http://uploader.polorix.net//files/258/picture/20080218045.jpg" target=_blank>picture2</a>&nbsp;&nbsp;<a href="http://uploader.polorix.net//files/258/picture/20080218048.jpg" target=_blank>picture3</a>&nbsp;&nbsp;<a href="http://uploader.polorix.net//files/258/picture/20080218049.jpg" target=_blank>picture4</a>&nbsp; <a href="http://uploader.polorix.net//files/258/picture/20080218050.jpg" target=_blank>picture5<br></a>这是今天修改后的图片.另外感谢赵冀宇,李涛同学的帮助,他们提供了很多好点子<br><a href="http://uploader.polorix.net//files/258/picture/20080218051.jpg" target=_blank>newpicture1</a>&nbsp;&nbsp;<a href="http://uploader.polorix.net//files/258/picture/20080218052.jpg" target=_blank>newpicture2</a>&nbsp; <a href="http://uploader.polorix.net//files/258/picture/20080218053.jpg" target=_blank>newpicture3</a><br>
<img src ="http://www.cppblog.com/dingounan/aggbug/42855.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dingounan/" target="_blank">Don</a> 2008-02-17 23:31 <a href="http://www.cppblog.com/dingounan/archive/2008/02/17/42855.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>id系列游戏的启动控制台</title><link>http://www.cppblog.com/dingounan/archive/2008/02/14/42747.html</link><dc:creator>Don</dc:creator><author>Don</author><pubDate>Thu, 14 Feb 2008 15:44:00 GMT</pubDate><guid>http://www.cppblog.com/dingounan/archive/2008/02/14/42747.html</guid><wfw:comment>http://www.cppblog.com/dingounan/comments/42747.html</wfw:comment><comments>http://www.cppblog.com/dingounan/archive/2008/02/14/42747.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/dingounan/comments/commentRss/42747.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dingounan/services/trackbacks/42747.html</trackback:ping><description><![CDATA[这些天重新整理以前的OpenGL程序,有时候需要检测Extensions是否存在;有时候要检测HGLRC是不是创建成功;...总是一遍一遍的MessageBox输出诊断信息非常的烦人.<br>今天就仿照id系列游戏的那个启动控制台(QuakeIII里一开始蓝底黄字的那个)模拟了一个,看过quake3-1.32b-source.zip上的做法,不懂,所以就纯粹依着自己的思路做的.大家多批评,要是能对您有帮助,更好!!<br>这里有个<a href="http://uploader.polorix.net//files/258/picture/TraceWindow_screenshot.PNG" target=_blank>截图</a>,满意的话看看.<br>这里还有源码:<a href="http://uploader.polorix.net//files/258/code/TraceWindow.zip" target=_blank>TraceWindow.zip</a><br><br>Visual C++ 6(SP6) 做的,链接了MultiThread DLL的CRT.(没有真正上OpenGL功能,只是拿着一个别人的启动数据模拟的,在data/log.txt里)<br><br>最后,总结一下做这个程序时的问题:<br>1.发送GUI消息,有两种方法:A:Post系列,大概就是<a href="http://msdn2.microsoft.com/en-us/library/ms644944(VS.85).aspx" target=_blank>PostMessage</a>.B:Send系列,有<a href="http://msdn2.microsoft.com/en-us/library/ms644950.aspx" target=_blank>SendMessage</a>,<a href="http://msdn2.microsoft.com/en-us/library/ms645515(VS.85).aspx" target=_blank>SendDlgItemMessage</a>.<br>Post系列只是发送消息,而Send系列除此动作之外还有一个等待消息被处理的过程.所以如果是从另外一个Thread向Message Loop发送GUI消息,请使用Post系列.<br>2.有时候想在WM_CREATE,WM_INITDIALOG里做一些初始化的动作,但是,如果在这其中向其它Control发送消息,比如说:<br>
<fieldset><legend>code</legend>SendDlgItemMessage(hDlg,IDC_LISTBOX,(WPARAM)LB_ADDSTRING,(LPARAM)text);</fieldset>这个时候不要指望text能够实时显示在ListBox里.原因是Message Loop被粘滞在WM_CREATE或WM_INITDIALOG的处理之中,所以没有Message Loop的流动,LB_ADDSTRING休想被传送到ListBox Control的Default Proc.
<img src ="http://www.cppblog.com/dingounan/aggbug/42747.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dingounan/" target="_blank">Don</a> 2008-02-14 23:44 <a href="http://www.cppblog.com/dingounan/archive/2008/02/14/42747.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Debian Linux(etch) .so 链接库路径</title><link>http://www.cppblog.com/dingounan/archive/2007/11/23/37224.html</link><dc:creator>Don</dc:creator><author>Don</author><pubDate>Fri, 23 Nov 2007 14:00:00 GMT</pubDate><guid>http://www.cppblog.com/dingounan/archive/2007/11/23/37224.html</guid><wfw:comment>http://www.cppblog.com/dingounan/comments/37224.html</wfw:comment><comments>http://www.cppblog.com/dingounan/archive/2007/11/23/37224.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dingounan/comments/commentRss/37224.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dingounan/services/trackbacks/37224.html</trackback:ping><description><![CDATA[这是我在使用ODE时遇到的.<br>一般来讲,在Linux上以源码方式安装,步骤就是简单的configure,make,make install就可以.<br>但是,问题可能会出现在make install上:编译好的动态链接库(.so)会被makefile放在类似/usr/local/lib之类的地方,而由于Linux各发行版之间的差别,这个位置未必就是在LD_LIBRARY_PATH里标识了,结果就导致程序找不到相应的动态链接库.<br>网上对于这个问题的解法,就是在系统中添加这一路径.<br>
<fieldset>add /usr/local/lib to /etc/ld.so.conf<br>and run: /sbin/ldconfig</fieldset>对于Debian,你可能找不到ld.so.conf这个文件.解决方法是:<br>
<fieldset>add /usr/local/lib to /etc/ld.so.conf.d/i486-linux-gnu.conf <br>and run: /sbin/ldconfig</fieldset>(以上都需要root权限)
<img src ="http://www.cppblog.com/dingounan/aggbug/37224.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dingounan/" target="_blank">Don</a> 2007-11-23 22:00 <a href="http://www.cppblog.com/dingounan/archive/2007/11/23/37224.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用DevIL截屏(写pixels到文件)</title><link>http://www.cppblog.com/dingounan/archive/2007/08/05/29371.html</link><dc:creator>Don</dc:creator><author>Don</author><pubDate>Sun, 05 Aug 2007 01:12:00 GMT</pubDate><guid>http://www.cppblog.com/dingounan/archive/2007/08/05/29371.html</guid><wfw:comment>http://www.cppblog.com/dingounan/comments/29371.html</wfw:comment><comments>http://www.cppblog.com/dingounan/archive/2007/08/05/29371.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dingounan/comments/commentRss/29371.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dingounan/services/trackbacks/29371.html</trackback:ping><description><![CDATA[<p>DevIL(原名OpenIL)是一个便捷化的图像读取/写入/处理的工具包,支持广泛的图像文件格式.可以在<a href="http://openil.sourceforge.net/" target=_blank>这里</a>找到它的信息.</p>
在它的tutorial中没有太详细的提及写pixels到文件的细节,在这里做一个笔记.<br>有以下几个过程:<br>1.为即将读取的pixels分配空间<br>假设使用的是RGBA,各8 bytes.共32 bytes.<br>
<fieldset>void* pixels=malloc(sizeof(GL_UNSIGNED_BYTE)*4 * width * height);</fieldset>2.从buffer读出pixels<br>
<fieldset>glReadPixels(0,height,width,height,GL_RGBA,GL_UNSIGNED_BYTE,pixels);</fieldset>3.生成图像代理,并绑定<br>
<fieldset>ilGenImages(1,&amp;image);<br>ilBindImage(image);</fieldset>4.复制pixels到图像代理,并指明数据来源<br>
<fieldset>ilTexImage(width,height,1,4,IL_RGBA,IL_UNSIGNED_BYTE,pixels);<br>ilSetData(pixels);</fieldset>注意:ilTexImage的第四个参数是bpp,为<span style="COLOR: #ff0000">bytes</span> per pixel,而非WGL里PIXELFORMATDESCRIPTOR所使用的<span style="COLOR: #ff0000">bits</span> per pixel.详细参考见<a href="http://www-f9.ijs.si/~matevz/docs/DevIL/il/f00059.htm" target=_blank>此处</a>.<br>5.最后,写文件<br>
<fieldset>ilSave(IL_PNG,"screenshot.png");</fieldset><br>事实上DevIL对于同一个操作有很多种不同的方式(比如那个写文件过程),详细内容可以参考<a href="http://www-f9.ijs.si/~matevz/docs/DevIL/" target=_blank>这里</a>(由于中国大陆这里众所周知的原因,<a href="http://openil.sourceforge.net/" target=_blank>DevIL位于SourceForge的文档</a>有时无法访问,所以我选择了它,但内容完全一样)
<img src ="http://www.cppblog.com/dingounan/aggbug/29371.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dingounan/" target="_blank">Don</a> 2007-08-05 09:12 <a href="http://www.cppblog.com/dingounan/archive/2007/08/05/29371.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Fedora 7安装手记</title><link>http://www.cppblog.com/dingounan/archive/2007/08/04/29339.html</link><dc:creator>Don</dc:creator><author>Don</author><pubDate>Sat, 04 Aug 2007 00:21:00 GMT</pubDate><guid>http://www.cppblog.com/dingounan/archive/2007/08/04/29339.html</guid><wfw:comment>http://www.cppblog.com/dingounan/comments/29339.html</wfw:comment><comments>http://www.cppblog.com/dingounan/archive/2007/08/04/29339.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dingounan/comments/commentRss/29339.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dingounan/services/trackbacks/29339.html</trackback:ping><description><![CDATA[Fedora 7的安装还是很简单.主要是如下几点:<br><strong>1.ATI驱动程序的安装</strong><br>我的显卡是ATI Mobility Radeon X1600<br>基本上可以承继Fedora Core 6的安装过程.详细过程可见<a href="http://wiki.cchtml.com/index.php/Fedora_Core_6_Installation_Guide" target=_blank>此处</a>.(我只在Fedora Core 6中尝试过此种方法,Fedora 7还不清楚).提醒一点,若在--buildpkg的时候,出现错误提示:<br>
<fieldset>please install an appropriate linux kernel module build package...</fieldset>是因为Fedora 7的预装kernel版本为2.6.21,而目前(4 Aug 2007)的ATI 驱动版本(8.39.4)需要kernel 2.6.22.需要预先升级kernel.(需要root权限)<br>
<fieldset>#yum update kernel</fieldset><br>另外说一下我的安装过程.从livna安装.具体情况参照<a href="http://rpm.livna.org/rlowiki/LivnaSwitcher" target=_blank>此处</a>.<br>首先配置yum<br>
<fieldset>#rpm -Uvh <a href="http://rpm.livna.org/livna-release-7.rpm">http://rpm.livna.org/livna-release-7.rpm</a></fieldset>然后安装驱动,依赖性检测将把所有package搜集齐全<br>
<fieldset>#yum install kmod-fglrx</fieldset>至此,安装成功!<br>通过<br>
<fieldset>#fglrxinfo</fieldset>确认安装成功.<br><strong>2.ADSL上网</strong><br>Fedora Core 6是通过<br>
<fieldset>#/usr/sbin/adsl-setup</fieldset>Fedora 7中adsl-setup没了,是用<br>
<fieldset>#/sbin/pppoe-setup</fieldset>两个的过程完全一样.根据提示设置即可.<br>
<img src ="http://www.cppblog.com/dingounan/aggbug/29339.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dingounan/" target="_blank">Don</a> 2007-08-04 08:21 <a href="http://www.cppblog.com/dingounan/archive/2007/08/04/29339.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>