re: 正確處理隨機(jī)選擇 Kevin Lynx 2009-03-23 13:18
@陳梓瀚(vczh)
我給徹底搞混了。回頭對比兩段代碼,囧,居然是一樣的。
那第一種方法也應(yīng)該是公平的。我把自己搞昏了,也把好幾個策劃搞昏了。
這次臉丟大了。
re: luckyScript測試程序:計(jì)算器 Kevin Lynx 2009-03-20 15:15
單就這篇博文而言,除了展示了段腳本代碼外,沒什么有用的東西。我同意cppexplore的說法
re: 面試中碰到的一個C++陷阱 Kevin Lynx 2009-03-18 14:08
@wocow3
我剛寫了點(diǎn)測試代碼,發(fā)現(xiàn)我們樓上的幾位觀點(diǎn)都有點(diǎn)小錯誤。
是的,成員函數(shù)指針比普通的指針復(fù)雜得多。例如:
class Test
{
public:
virtual void print() {}
};
printf( "%d\n", sizeof( &Test::print ) );
就以上代碼,我在VS2005下得出的結(jié)果是4(如我們所說),但是在gcc下得出的卻是8!而gcc對于一般的函數(shù)(C函數(shù))指針卻是4.
并且,
typedef void (Test::*mem_fn_ptr)();
mem_fn_ptr p = &Test::print;
printf( "%d\n", p );
的結(jié)果在不同的編譯器上也不同,gcc得出的如我所想,是一個偏移值,而VC則始終給出一個真正的地址值。更為奇怪的是,在gcc下去掉virtual關(guān)鍵字,即讓print為一個普通函數(shù),那么其值也為一個真正的地址值。
看來,這個面試官考的也許正是這個。無論如何,一個成員函數(shù)指針不同于普通指針。
參考:
http://www.codeproject.com/KB/cpp/FastDelegate.aspx
re: 面試中碰到的一個C++陷阱 Kevin Lynx 2009-03-18 13:28
大家應(yīng)該明確下這里討論的東西,【虛函數(shù)指針】,終究來說還是指針,32位機(jī)器上就是32位。我覺得博主在這里和大家討論并沒有針對指針這個概念。成員函數(shù)指針也是個指針,也是32位,但是其指針值不同一般指針。
面試官問你的問題如果類似于:xxxx指針有多大。。那很明顯,要么是他表述問題的能力有問題,要么是其真的不懂這些東西。面試你的人不見得就比你牛。
其實(shí)這樣說并不全面。
unix發(fā)展到后來,已經(jīng)并不僅僅指的是60年代那個開發(fā)出來的操作系統(tǒng),而成為一種標(biāo)準(zhǔn),基本上凡是符合該標(biāo)準(zhǔn)的OS都可稱為unix。linux,bsd,solaris之類都可以被稱為unix。
詳見:
http://en.wikipedia.org/wiki/Unix
http://en.wikipedia.org/wiki/Single_UNIX_Specification
unix規(guī)格說明文檔中描述,凡是符合此標(biāo)準(zhǔn)的OS,都可使用unix商標(biāo)。(大致是這樣的)
@夢在天涯
這個例子是用于判定一個字符串是否全部是數(shù)字,不過例子中寫的有問題,應(yīng)該是:
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
存檔的指針指向的內(nèi)存是由你自己來維護(hù)的,不是set來維護(hù),所有有內(nèi)存泄露,也是你自己的錯誤。
std::sort不能對std::list進(jìn)行排序,那是因?yàn)閟td::sort只能對random-access iterator進(jìn)行操作,std::list::iterator不是random-access的。所以std::list才自己提供了sort函數(shù)。
詳細(xì)參看std::sort文檔
@陳梓瀚(vczh)
貌似是的,后面對于錯誤的處理,甚至最基本的錯誤報告(定位)都存在問題。對這塊不熟,沒管了。
cout << this->foreach( this->test1, 4, 5);
改為:
cout << this->foreach( &GridTest::test1, 4, 5);
對于C函數(shù)來說,函數(shù)名直接表示其函數(shù)地址,但是對于成員函數(shù)而言,則必須使用&ClassName::memFn才表示該成員函數(shù)的地址。gcc對C++語法要求更嚴(yán)格。
re: 一些學(xué)習(xí)筆記 ,陷阱,缺陷 Kevin Lynx 2009-03-09 09:42
第三個確實(shí)詭異,不過C支持那樣的代碼是有原因的:
http://en.wikipedia.org/wiki/C_trigraph#C
為了支持一些沒有\(zhòng)符號的鍵盤。
@陳梓瀚(vczh)
這個宏定義在哪里?定義在代碼文件里的話肯定不起作用(會把定義的地方也簽入),在工程設(shè)置里定義會簽出工程文件。
@劍神一笑
你說的有道理。我也越來越喜歡UNIX的東西了。:)
re: 開發(fā)環(huán)境安裝完占用的空間 Kevin Lynx 2009-01-23 21:26
......16G..............
PEB結(jié)構(gòu)是TEB結(jié)構(gòu)的成員?
struct TEB
{
...
struct PEB
{
....
??
MSDN:
typedef struct _TEB{
BYTE Reserved1[1952];
PVOID TlsSlots[64];
...
typedef struct _PEB{
BYTE Reserved1[2];
BYTE BeingDebugger; //是有個標(biāo)志標(biāo)示進(jìn)程是否被調(diào)試
...
從你的文章來看,PEB應(yīng)該在TEB偏移0x30H字節(jié)的地方,但是從MSDN的TEB結(jié)構(gòu)定義來看,PEB位于Reserved1[1952]中的某個位置?
re: 匯編,讓你更拉風(fēng) Kevin Lynx 2009-01-10 10:02
沙發(fā)
re: 小寫了個XML解析器 Kevin Lynx 2009-01-08 09:07
@胖dudu
不用自己做了。BSD(相關(guān)組織)早使用宏寫了一套數(shù)據(jù)結(jié)構(gòu),鏈表,樹,等等。
re: VS2005斷點(diǎn)失效的問題 Kevin Lynx 2009-01-05 08:59
這種情況不解決辦法有 很多。你這個方法我沒用過。最簡單的方法就是ctrl+a, ctrl+f重新格式化這個‘不可調(diào)試’的CPP文件,然后編譯該CPP文件,一般就可以解決。當(dāng)然,有時候也無法解決。
@CK
這里說的就是DEBUG模式。
re: 讓人無語的boost[未登錄] Kevin Lynx 2008-12-28 18:16
:)
不開RTTI,typeid只對靜態(tài)類型有效了,也就是只對編譯器就可以確定的類型有效。
re: 最近接觸的東西 Kevin Lynx 2008-12-12 17:43
@aa
你對我寫這些代碼的前提誤會了。這些代碼是我讀書的時候在寢室寫的。整個周期沒有那么復(fù)雜,就是自己決定做個什么小游戲,然后寫設(shè)計(jì)文檔,然后開始編碼,游戲運(yùn)行基本良好就算完成。然后開始寫下個東西。那個時候是每天早上8點(diǎn)起床到晚上1點(diǎn)左右,排除吃飯時間,基本坐在電腦前。當(dāng)然,每做完一個東西的時候會有幾天的休息。也會有很長一段時間用于看書。我還是肯定地告訴你,是10W行,可以用行數(shù)統(tǒng)計(jì)工具統(tǒng)計(jì)的10W行。當(dāng)然,我承認(rèn),這10W行代碼沒什么技術(shù)含量。
re: 最近接觸的東西 Kevin Lynx 2008-12-12 15:51
@aa
我認(rèn)為注釋、空行都算作源代碼的一部分。如果你面對沒有空行和注釋的代碼,你會覺得這個代碼怎樣?沒有統(tǒng)計(jì)第三方庫代碼,自己的代碼可能有重復(fù)統(tǒng)計(jì)。需要的話我把這些代碼發(fā)你你統(tǒng)計(jì)。
re: VIM學(xué)習(xí) Kevin Lynx 2008-12-11 09:17
vim可以讓你的手不用離開鍵盤去摸鼠標(biāo),甚至不用去摸方向鍵。
re: cygwin 使用 Kevin Lynx 2008-12-11 09:16
當(dāng)初在選擇cygwin和mingw(雖然兩者功能不盡相同)的時候,本來是選擇cygwin的,因?yàn)橛懈嗟膌inux工具可用,mingw則可能只是一個gcc的移植,用setup在線安裝的時候總是不成功,懷疑是網(wǎng)速過慢。于是只好裝mingw了。
re: 小寫了個XML解析器 Kevin Lynx 2008-12-11 08:50
@肥仔
- -!
我恰好說了,如果parent直接保存children,好占空間的,例如你這個vector,雖然我的處理方式累了點(diǎn)。- -!
re: TortoiseSVN也可以用來比較兩個文件 Kevin Lynx 2008-12-10 15:41
- -|
我還以為是什么。。。
@嘯天豬
STL predicator不會要求是純虛函數(shù)性質(zhì),唯一的要求就是這是一個具有operator()性質(zhì)的東西,普通C函數(shù),重載了operator() 的類均可。我文章里說的問題在于,函數(shù)不是:
bool operator() ( .... ) const // 需要加上const
{
}
TU是不是編譯單元?如果是標(biāo)準(zhǔn)規(guī)定,哥們可以給我下文檔鏈接不?
@Xw.Y
我的問題同你的本質(zhì)是一樣的。
@Jetricy
作為一個STL USER,我還是要捍衛(wèi)下STL的質(zhì)量。
@浪跡天涯
老實(shí)說,實(shí)際項(xiàng)目里還沒用過memcached。
@浪跡天涯
改造網(wǎng)絡(luò)模型?不清楚。我只知道使用別人的庫。- -|
re: 手把手教你寫腳本引擎(二)——命令腳本[未登錄] Kevin Lynx 2008-10-23 11:11
雖然以前知道你發(fā)的這些文章,但是很少看過,理由很簡單,我覺得要用一些閑暇時間去看你的文章,是不夠的。
今天終于看完了你這個系列的第二篇,并且看了代碼。大致上算理解了你這篇文章講的東西。感覺就是,設(shè)計(jì)和代碼都很老練。
re: 金山2009校園招聘成都一筆試題[未登錄] Kevin Lynx 2008-10-21 09:19
據(jù)以前在金山工作過的兩個朋友所說,金山加班嚴(yán)重(就是成都金山),不敢去。想多活幾年。
re: 金山2009校園招聘成都一筆試題[未登錄] Kevin Lynx 2008-10-21 09:18
@Fox
從設(shè)計(jì)角度來看,即使destructor是trivial的,但是因?yàn)榛惡团缮惔嬖诙鄳B(tài)的使用,即對于應(yīng)用層而言有類似的代碼:
base *pObj = new derived();
那么,destructor都應(yīng)該為virtual的。
re: 讓人無語的boost[未登錄] Kevin Lynx 2008-10-15 23:45
@littlewater
boost::any用到了typeid,這個東西不開RTTI還是可以工作的,但是對于具有vtable的類,要讓typeid工作,就需要開RTTI。
@megax
你這樣說有點(diǎn)不對,指針參數(shù)不見得就會保存該指針。
事實(shí)上,doc確實(shí)沒保存printer,粗略地看了下這塊的代碼,Accept純碎是將一些信息輸出到printer而已。
re: 代碼自動生成-宏遞歸思想[未登錄] Kevin Lynx 2008-09-24 11:01
剛我自己復(fù)制了你的代碼嘗試了下,
TinyXml 2.5.3 vs2005 沒有出現(xiàn)你說的錯誤 = =
我也閱讀了TiXmlPrinter 的文檔,發(fā)現(xiàn)我可能說錯了。
我用TinyXML雖然沒用過TiXmlPrinter ,但是,從你的代碼來看,我個人感覺就有點(diǎn)問題:
doc.Accept( &printer );
從接口使用來看,Accept接受了一個指針,那么doc內(nèi)部可能只保存該指針,而不是完全復(fù)制printer對象,那么,在BuildXMLFile退出后,printer對象destruct。假設(shè)Document和Printer在關(guān)于Accept這個動作之間有指針?biāo)袡?quán)改變的動作,那么這個自動destruct動作就可能導(dǎo)致問題。
將這些代碼都放在同一個作用域里不出問題,也是我做這樣推斷的理由之一。
re: 代碼自動生成-宏遞歸思想 Kevin Lynx 2008-09-17 09:52
@littlewater
依然不明白什么是“這一輪繼續(xù)被遞歸”,更不明白你寫下的
“DEF_XXX( template <typename R, typename P1> class functor<R(P1)>; )
”
是為了說明什么。
我推測,你的意思是說,當(dāng)宏參數(shù)本身也是一個宏,而這個宏的宏體內(nèi)有逗號時,將會出現(xiàn)歧義:
#define PARAM typename P1,
#define DEF_PARAM( a, b ) something
DEF_PARAM( PARAM, something ); 時,在展開宏體時就會出現(xiàn)DEF_PARAM( typename P1, , something ) 就會出現(xiàn)兩個逗號。
解決這個問題的辦法時,不讓PARAM宏提前展開。
宏展開的一個規(guī)則是:如果某個宏(如DEF_PARAM)的宏實(shí)參也是一個宏(如PARAM),那么在展開這個宏之前,會先展開宏實(shí)參,并將展開后的宏體替換到宏中,然后第二次掃描,如果還有宏,則繼續(xù)展開。
所以,解決辦法就是,讓實(shí)參不是一個宏!
宏展開還有一個規(guī)則是:即使宏實(shí)參是一個宏,但是這個宏具有括號屬性,例如
#define PARAM( n ) ,typename P##n 中PARAM宏就是這么一個具有括號屬性的宏,該宏作為宏實(shí)參時,如果沒有提供其參數(shù),那么它將被作為普通符號,而不是一個宏。
因此,在代碼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,因?yàn)镻ARAM是一個具有括號屬性的宏,如果展開,那么將出現(xiàn)你說的問題。
re: 代碼自動生成-宏遞歸思想 Kevin Lynx 2008-09-16 16:10
#define PARAM( n ) ,typename P##n
#define PARAM_END typename P1
去掉那個逗號不就可以了?
有些不明白littlewater意思。
@littlewater
我感覺更多地是對線程的描述吧?
@czc
非常高興有人可以給我提出如此寶貴的意見!我覺得很少有人會把我寫的東西認(rèn)真讀過,甚至相關(guān)代碼。
1)我覺得你是對的,我認(rèn)為只要類模板被實(shí)例化,就相當(dāng)于產(chǎn)生了一個類,那么就會產(chǎn)生這個static變量。但是typedef很可能沒有實(shí)例化類模板,所以我覺得你是對的,但是如何去證明這一點(diǎn)?
2)你說的完全正確。當(dāng)lua_binder被用于實(shí)際項(xiàng)目時,我也發(fā)現(xiàn)了這個問題,所以最后我只得用一個ID去區(qū)分這些binder:
template <typename Prototype, long id>
class lua_binder;
上層代碼就不得不自己提供一個唯一的ID,很丑陋,但是我沒有想到優(yōu)雅的解決辦法,不知道你有沒有什么看法?
加上正常關(guān)閉closesocket之類,在程序未退出前不要ctrl+c強(qiáng)制退出。你試下這些。我做實(shí)驗(yàn)也是在WIN平臺下。
@thinkinnight
發(fā)送RST通常都是因?yàn)楫惓M顺鰧?dǎo)致的。可能你沒有正常關(guān)閉。
@dikatour
這個測試?yán)哟_實(shí)可能出現(xiàn)這樣的問題。但是在klhttpd中則不會存在,response的內(nèi)容都交給應(yīng)用層去做。
re: *a++與(*a)++的區(qū)別[未登錄] Kevin Lynx 2008-09-01 11:43
*A++ 先返回A,然后計(jì)算*A,那么這個表達(dá)式返回的值就是*A,然后A++,將A自身改變
(*A)++,先計(jì)算*A的值,這個表達(dá)式返回的值就是*A,然后A指向的變量值++
average的例子直接取得<C++ template>呀,模板遞歸的例子也是模板元里的常見例子。
這些東西有什么用?當(dāng)你有這個思想時,你會發(fā)現(xiàn)它非常有用。說沒用的人,那是他自己根本不懂。
概念性問題而已。
const int a = 12; 表示a 是個常量
const char * STR_TEST = "Hello world!";表示STR_TEST指向的內(nèi)容是常量,但其本身(作為一個指針變量而言)不是一個常量。
所以:
char * const STR_TEST = ".." 即可
cppblog人才輩出,不敢說話了。
我是真的來灌水......
通過functor,可以做到將成員函數(shù),C式函數(shù),operator(),等綁定為線程函數(shù).
我覺得這種方式起碼比繼承重寫某個虛函數(shù)來得靈活.
看來很多人都偏向于回調(diào)啊。我剛開始也打算用回調(diào),但是leader說這樣很麻煩。我們原有的腳本系統(tǒng)就是采用掛起的方式。如果采用回調(diào),那么對于sleep這樣的操作你們是怎么做的?
@創(chuàng)
確實(shí),這個也算不做造輪子。之前我基本上將SGI的內(nèi)存池翻譯成C代碼,所以我對那一塊比較熟悉。一看你的代碼,我就覺得很眼熟。:D
@金哥
同意你的說法。我覺得我們周圍有很多程序員都抱著這樣的想法。他們總以“不重造輪子”的觀點(diǎn)告誡自己,從而不知道很多東西的底層實(shí)現(xiàn)原理。就像有些程序員以“盲目的優(yōu)化只會適得其反”這樣觀點(diǎn)為理由,而忽視了優(yōu)化的重要性一樣。
不重造輪子,是基于你懂得造輪子的原理基礎(chǔ)上的。而如果你自己都不懂,連重造輪子的能力都沒有,那基本就比重造輪子的人還差了。