loop_in_codes

低调做技术__欢迎移步我的独立博客 codemaro.com 微博 kevinlynx

共6页: 1 2 3 4 5 6 
re: 正确处理随机选择 Kevin Lynx 2009-03-23 13:18
@陈梓瀚(vczh)
我给彻底搞混了。回头对比两段代码,囧,居然是一样的。
那第一种方法也应该是公平的。我把自己搞昏了,也把好几个策划搞昏了。

这次脸丢大了。
re: luckyScript测试程序:计算器 Kevin Lynx 2009-03-20 15:15
单就这篇博文而言,除了展示了段脚本代码外,没什么有用的东西。我同意cppexplore的说法
re: 面试中碰到的一个C++陷阱 Kevin Lynx 2009-03-18 14:08
@wocow3
我刚写了点测试代码,发现我们楼上的几位观点都有点小错误。
是的,成员函数指针比普通的指针复杂得多。例如:
class Test
{
public:
virtual void print() {}
};

printf( "%d\n", sizeof( &Test::print ) );

就以上代码,我在VS2005下得出的结果是4(如我们所说),但是在gcc下得出的却是8!而gcc对于一般的函数(C函数)指针却是4.

并且,
typedef void (Test::*mem_fn_ptr)();
mem_fn_ptr p = &Test::print;
printf( "%d\n", p );
的结果在不同的编译器上也不同,gcc得出的如我所想,是一个偏移值,而VC则始终给出一个真正的地址值。更为奇怪的是,在gcc下去掉virtual关键字,即让print为一个普通函数,那么其值也为一个真正的地址值。

看来,这个面试官考的也许正是这个。无论如何,一个成员函数指针不同于普通指针。
参考:http://www.codeproject.com/KB/cpp/FastDelegate.aspx
re: 面试中碰到的一个C++陷阱 Kevin Lynx 2009-03-18 13:28
大家应该明确下这里讨论的东西,【虚函数指针】,终究来说还是指针,32位机器上就是32位。我觉得博主在这里和大家讨论并没有针对指针这个概念。成员函数指针也是个指针,也是32位,但是其指针值不同一般指针。

面试官问你的问题如果类似于:xxxx指针有多大。。那很明显,要么是他表述问题的能力有问题,要么是其真的不懂这些东西。面试你的人不见得就比你牛。
re: linux和unix的区别(转) Kevin Lynx 2009-03-16 11:40
其实这样说并不全面。
unix发展到后来,已经并不仅仅指的是60年代那个开发出来的操作系统,而成为一种标准,基本上凡是符合该标准的OS都可称为unix。linux,bsd,solaris之类都可以被称为unix。

详见:
http://en.wikipedia.org/wiki/Unix
http://en.wikipedia.org/wiki/Single_UNIX_Specification
unix规格说明文档中描述,凡是符合此标准的OS,都可使用unix商标。(大致是这样的)
@梦在天涯
这个例子是用于判定一个字符串是否全部是数字,不过例子中写的有问题,应该是:
int is_number( const char *str )
{
while( *str != 0 )
{
if( !isdigit( *str++ ) ) return 0;
}
return 1;
}

谢谢提醒。
re: STL容器误用一则 Kevin Lynx 2009-03-11 09:22
存档的指针指向的内存是由你自己来维护的,不是set来维护,所有有内存泄露,也是你自己的错误。

std::sort不能对std::list进行排序,那是因为std::sort只能对random-access iterator进行操作,std::list::iterator不是random-access的。所以std::list才自己提供了sort函数。

详细参看std::sort文档
@陈梓瀚(vczh)
貌似是的,后面对于错误的处理,甚至最基本的错误报告(定位)都存在问题。对这块不熟,没管了。
cout << this->foreach( this->test1, 4, 5);
改为:
cout << this->foreach( &GridTest::test1, 4, 5);

对于C函数来说,函数名直接表示其函数地址,但是对于成员函数而言,则必须使用&ClassName::memFn才表示该成员函数的地址。gcc对C++语法要求更严格。

re: 一些学习笔记 ,陷阱,缺陷 Kevin Lynx 2009-03-09 09:42
第三个确实诡异,不过C支持那样的代码是有原因的:
http://en.wikipedia.org/wiki/C_trigraph#C
为了支持一些没有\符号的键盘。
re: 玩了一下alienbrain的EventsScript Kevin Lynx 2009-03-01 13:22
@陈梓瀚(vczh)
这个宏定义在哪里?定义在代码文件里的话肯定不起作用(会把定义的地方也签入),在工程设置里定义会签出工程文件。
@剑神一笑

你说的有道理。我也越来越喜欢UNIX的东西了。:)
re: 开发环境安装完占用的空间 Kevin Lynx 2009-01-23 21:26
......16G..............
PEB结构是TEB结构的成员?
struct TEB
{
...
struct PEB
{
....
??

MSDN:
typedef struct _TEB{
BYTE Reserved1[1952];
PVOID TlsSlots[64];
...

typedef struct _PEB{
BYTE Reserved1[2];
BYTE BeingDebugger; //是有个标志标示进程是否被调试
...
从你的文章来看,PEB应该在TEB偏移0x30H字节的地方,但是从MSDN的TEB结构定义来看,PEB位于Reserved1[1952]中的某个位置?
re: 汇编,让你更拉风 Kevin Lynx 2009-01-10 10:02
沙发
re: 小写了个XML解析器 Kevin Lynx 2009-01-08 09:07
@胖dudu
不用自己做了。BSD(相关组织)早使用宏写了一套数据结构,链表,树,等等。
re: VS2005断点失效的问题 Kevin Lynx 2009-01-05 08:59
这种情况不解决办法有 很多。你这个方法我没用过。最简单的方法就是ctrl+a, ctrl+f重新格式化这个‘不可调试’的CPP文件,然后编译该CPP文件,一般就可以解决。当然,有时候也无法解决。
@CK
这里说的就是DEBUG模式。
re: 让人无语的boost[未登录] Kevin Lynx 2008-12-28 18:16
:)
不开RTTI,typeid只对静态类型有效了,也就是只对编译器就可以确定的类型有效。
re: 最近接触的东西 Kevin Lynx 2008-12-12 17:43
@aa
你对我写这些代码的前提误会了。这些代码是我读书的时候在寝室写的。整个周期没有那么复杂,就是自己决定做个什么小游戏,然后写设计文档,然后开始编码,游戏运行基本良好就算完成。然后开始写下个东西。那个时候是每天早上8点起床到晚上1点左右,排除吃饭时间,基本坐在电脑前。当然,每做完一个东西的时候会有几天的休息。也会有很长一段时间用于看书。我还是肯定地告诉你,是10W行,可以用行数统计工具统计的10W行。当然,我承认,这10W行代码没什么技术含量。
re: 最近接触的东西 Kevin Lynx 2008-12-12 15:51
@aa
我认为注释、空行都算作源代码的一部分。如果你面对没有空行和注释的代码,你会觉得这个代码怎样?没有统计第三方库代码,自己的代码可能有重复统计。需要的话我把这些代码发你你统计。
re: VIM学习 Kevin Lynx 2008-12-11 09:17
vim可以让你的手不用离开键盘去摸鼠标,甚至不用去摸方向键。
re: cygwin 使用 Kevin Lynx 2008-12-11 09:16
当初在选择cygwin和mingw(虽然两者功能不尽相同)的时候,本来是选择cygwin的,因为有更多的linux工具可用,mingw则可能只是一个gcc的移植,用setup在线安装的时候总是不成功,怀疑是网速过慢。于是只好装mingw了。
re: 小写了个XML解析器 Kevin Lynx 2008-12-11 08:50
@肥仔
- -!
我恰好说了,如果parent直接保存children,好占空间的,例如你这个vector,虽然我的处理方式累了点。- -!
- -|

我还以为是什么。。。

@啸天猪
STL predicator不会要求是纯虚函数性质,唯一的要求就是这是一个具有operator()性质的东西,普通C函数,重载了operator() 的类均可。我文章里说的问题在于,函数不是:
bool operator() ( .... ) const // 需要加上const
{
}

TU是不是编译单元?如果是标准规定,哥们可以给我下文档链接不?

@Xw.Y

我的问题同你的本质是一样的。

@Jetricy
作为一个STL USER,我还是要捍卫下STL的质量。
@浪迹天涯
老实说,实际项目里还没用过memcached。
@浪迹天涯
改造网络模型?不清楚。我只知道使用别人的库。- -|
虽然以前知道你发的这些文章,但是很少看过,理由很简单,我觉得要用一些闲暇时间去看你的文章,是不够的。

今天终于看完了你这个系列的第二篇,并且看了代码。大致上算理解了你这篇文章讲的东西。感觉就是,设计和代码都很老练。
据以前在金山工作过的两个朋友所说,金山加班严重(就是成都金山),不敢去。想多活几年。
@Fox
从设计角度来看,即使destructor是trivial的,但是因为基类和派生类存在多态的使用,即对于应用层而言有类似的代码:
base *pObj = new derived();
那么,destructor都应该为virtual的。
re: 让人无语的boost[未登录] Kevin Lynx 2008-10-15 23:45
@littlewater
boost::any用到了typeid,这个东西不开RTTI还是可以工作的,但是对于具有vtable的类,要让typeid工作,就需要开RTTI。
@megax
你这样说有点不对,指针参数不见得就会保存该指针。
事实上,doc确实没保存printer,粗略地看了下这块的代码,Accept纯碎是将一些信息输出到printer而已。

今天发现boost果然有这么一个宏库:
http://www.boost.org/doc/libs/1_36_0/libs/preprocessor/doc/index.html

然后在<C++ Template Metaprogramming>一书里也看到类似的阐述:
http://www.boostpro.com/tmpbook/preprocessor.html

原来我又重造了一次轮子,还没造好。 = =|
刚我自己复制了你的代码尝试了下,
TinyXml 2.5.3 vs2005 没有出现你说的错误 = =
我也阅读了TiXmlPrinter 的文档,发现我可能说错了。
我用TinyXML虽然没用过TiXmlPrinter ,但是,从你的代码来看,我个人感觉就有点问题:

doc.Accept( &printer );

从接口使用来看,Accept接受了一个指针,那么doc内部可能只保存该指针,而不是完全复制printer对象,那么,在BuildXMLFile退出后,printer对象destruct。假设Document和Printer在关于Accept这个动作之间有指针所有权改变的动作,那么这个自动destruct动作就可能导致问题。

将这些代码都放在同一个作用域里不出问题,也是我做这样推断的理由之一。
re: 代码自动生成-宏递归思想 Kevin Lynx 2008-09-17 09:52
@littlewater
依然不明白什么是“这一轮继续被递归”,更不明白你写下的
“DEF_XXX( template <typename R, typename P1> class functor<R(P1)>; )

是为了说明什么。

我推测,你的意思是说,当宏参数本身也是一个宏,而这个宏的宏体内有逗号时,将会出现歧义:
#define PARAM typename P1,
#define DEF_PARAM( a, b ) something

DEF_PARAM( PARAM, something ); 时,在展开宏体时就会出现DEF_PARAM( typename P1, , something ) 就会出现两个逗号。

解决这个问题的办法时,不让PARAM宏提前展开。

宏展开的一个规则是:如果某个宏(如DEF_PARAM)的宏实参也是一个宏(如PARAM),那么在展开这个宏之前,会先展开宏实参,并将展开后的宏体替换到宏中,然后第二次扫描,如果还有宏,则继续展开。

所以,解决办法就是,让实参不是一个宏!

宏展开还有一个规则是:即使宏实参是一个宏,但是这个宏具有括号属性,例如
#define PARAM( n ) ,typename P##n 中PARAM宏就是这么一个具有括号属性的宏,该宏作为宏实参时,如果没有提供其参数,那么它将被作为普通符号,而不是一个宏。

因此,在代码kl_macro_params.h中:
#define PARAM( n ) ,typename P##n
#define DEF_PARAM( n ) REPEAT_##n( n, PARAM, PARAM_END )

若DEF_PARAM( 2 ) 时,会得到REPEAT_2( 2, PARAM, PARAM_END )展开REPEAT_2宏时,并不会先展开PARAM,因为PARAM是一个具有括号属性的宏,如果展开,那么将出现你说的问题。
re: 代码自动生成-宏递归思想 Kevin Lynx 2008-09-16 16:10
#define PARAM( n ) ,typename P##n
#define PARAM_END typename P1

去掉那个逗号不就可以了?

有些不明白littlewater意思。
@littlewater
我感觉更多地是对线程的描述吧?
@czc
非常高兴有人可以给我提出如此宝贵的意见!我觉得很少有人会把我写的东西认真读过,甚至相关代码。

1)我觉得你是对的,我认为只要类模板被实例化,就相当于产生了一个类,那么就会产生这个static变量。但是typedef很可能没有实例化类模板,所以我觉得你是对的,但是如何去证明这一点?

2)你说的完全正确。当lua_binder被用于实际项目时,我也发现了这个问题,所以最后我只得用一个ID去区分这些binder:
template <typename Prototype, long id>
class lua_binder;
上层代码就不得不自己提供一个唯一的ID,很丑陋,但是我没有想到优雅的解决办法,不知道你有没有什么看法?
re: tcp要点学习-建立连接 Kevin Lynx 2008-09-05 09:30
加上正常关闭closesocket之类,在程序未退出前不要ctrl+c强制退出。你试下这些。我做实验也是在WIN平台下。
re: tcp要点学习-建立连接 Kevin Lynx 2008-09-04 13:54
@thinkinnight
发送RST通常都是因为异常退出导致的。可能你没有正常关闭。
re: 实现自己的http server Kevin Lynx 2008-09-04 13:53
@dikatour
这个测试例子确实可能出现这样的问题。但是在klhttpd中则不会存在,response的内容都交给应用层去做。

re: *a++与(*a)++的区别[未登录] Kevin Lynx 2008-09-01 11:43
*A++ 先返回A,然后计算*A,那么这个表达式返回的值就是*A,然后A++,将A自身改变

(*A)++,先计算*A的值,这个表达式返回的值就是*A,然后A指向的变量值++

average的例子直接取得<C++ template>呀,模板递归的例子也是模板元里的常见例子。

这些东西有什么用?当你有这个思想时,你会发现它非常有用。说没用的人,那是他自己根本不懂。
re: "multiple definition of" 错误 Kevin Lynx 2008-08-27 08:59
概念性问题而已。

const int a = 12; 表示a 是个常量
const char * STR_TEST = "Hello world!";表示STR_TEST指向的内容是常量,但其本身(作为一个指针变量而言)不是一个常量。
所以:
char * const STR_TEST = ".." 即可
cppblog人才辈出,不敢说话了。
我是真的来灌水......
通过functor,可以做到将成员函数,C式函数,operator(),等绑定为线程函数.
我觉得这种方式起码比继承重写某个虚函数来得灵活.
看来很多人都偏向于回调啊。我刚开始也打算用回调,但是leader说这样很麻烦。我们原有的脚本系统就是采用挂起的方式。如果采用回调,那么对于sleep这样的操作你们是怎么做的?
@创
确实,这个也算不做造轮子。之前我基本上将SGI的内存池翻译成C代码,所以我对那一块比较熟悉。一看你的代码,我就觉得很眼熟。:D

@金哥
同意你的说法。我觉得我们周围有很多程序员都抱着这样的想法。他们总以“不重造轮子”的观点告诫自己,从而不知道很多东西的底层实现原理。就像有些程序员以“盲目的优化只会适得其反”这样观点为理由,而忽视了优化的重要性一样。

不重造轮子,是基于你懂得造轮子的原理基础上的。而如果你自己都不懂,连重造轮子的能力都没有,那基本就比重造轮子的人还差了。
共6页: 1 2 3 4 5 6