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商標。(大致是這樣的)
re: 實現一種解釋性腳本語言(三) Kevin Lynx 2009-03-15 16:47
@夢在天涯
這個例子是用于判定一個字符串是否全部是數字,不過例子中寫的有問題,應該是:
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文檔
re: 實現一種解釋性腳本語言(四) Kevin Lynx 2009-03-09 22:26
@陳梓瀚(vczh)
貌似是的,后面對于錯誤的處理,甚至最基本的錯誤報告(定位)都存在問題。對這塊不熟,沒管了。
re: 求助:關于 C++函數指針, 成員函數指針的問題 Kevin Lynx 2009-03-09 17:52
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
為了支持一些沒有\符號的鍵盤。
@陳梓瀚(vczh)
這個宏定義在哪里?定義在代碼文件里的話肯定不起作用(會把定義的地方也簽入),在工程設置里定義會簽出工程文件。
re: 實現自己的LUA綁定器-一個模板編程挑戰 Kevin Lynx 2009-02-28 14:54
@劍神一笑
你說的有道理。我也越來越喜歡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,雖然我的處理方式累了點。- -!
re: TortoiseSVN也可以用來比較兩個文件 Kevin Lynx 2008-12-10 15:41
- -|
我還以為是什么。。。
@嘯天豬
STL predicator不會要求是純虛函數性質,唯一的要求就是這是一個具有operator()性質的東西,普通C函數,重載了operator() 的類均可。我文章里說的問題在于,函數不是:
bool operator() ( .... ) const // 需要加上const
{
}
TU是不是編譯單元?如果是標準規定,哥們可以給我下文檔鏈接不?
@Xw.Y
我的問題同你的本質是一樣的。
re: 學生做的正則表達式引擎提供下載![未登錄] Kevin Lynx 2008-11-10 20:55
@Jetricy
作為一個STL USER,我還是要捍衛下STL的質量。
re: 自己實現memcached客戶端庫[未登錄] Kevin Lynx 2008-10-23 20:44
@浪跡天涯
老實說,實際項目里還沒用過memcached。
@浪跡天涯
改造網絡模型?不清楚。我只知道使用別人的庫。- -|
re: 手把手教你寫腳本引擎(二)——命令腳本[未登錄] Kevin Lynx 2008-10-23 11:11
雖然以前知道你發的這些文章,但是很少看過,理由很簡單,我覺得要用一些閑暇時間去看你的文章,是不夠的。
今天終于看完了你這個系列的第二篇,并且看了代碼。大致上算理解了你這篇文章講的東西。感覺就是,設計和代碼都很老練。
re: 金山2009校園招聘成都一筆試題[未登錄] Kevin Lynx 2008-10-21 09:19
據以前在金山工作過的兩個朋友所說,金山加班嚴重(就是成都金山),不敢去。想多活幾年。
re: 金山2009校園招聘成都一筆試題[未登錄] Kevin Lynx 2008-10-21 09:18
@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而已。
re: 代碼自動生成-宏遞歸思想[未登錄] Kevin Lynx 2008-09-24 11:01
剛我自己復制了你的代碼嘗試了下,
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
我感覺更多地是對線程的描述吧?
re: 實現自己的LUA綁定器-一個模板編程挑戰 Kevin Lynx 2008-09-12 09:28
@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>呀,模板遞歸的例子也是模板元里的常見例子。
這些東西有什么用?當你有這個思想時,你會發現它非常有用。說沒用的人,那是他自己根本不懂。
概念性問題而已。
const int a = 12; 表示a 是個常量
const char * STR_TEST = "Hello world!";表示STR_TEST指向的內容是常量,但其本身(作為一個指針變量而言)不是一個常量。
所以:
char * const STR_TEST = ".." 即可
cppblog人才輩出,不敢說話了。
我是真的來灌水......
re: 線程模型:將任務與執行分離[未登錄] Kevin Lynx 2008-08-24 10:18
通過functor,可以做到將成員函數,C式函數,operator(),等綁定為線程函數.
我覺得這種方式起碼比繼承重寫某個虛函數來得靈活.
看來很多人都偏向于回調啊。我剛開始也打算用回調,但是leader說這樣很麻煩。我們原有的腳本系統就是采用掛起的方式。如果采用回調,那么對于sleep這樣的操作你們是怎么做的?
re: 服務器公共庫開發-內存池管理模塊 Kevin Lynx 2008-08-13 10:13
@創
確實,這個也算不做造輪子。之前我基本上將SGI的內存池翻譯成C代碼,所以我對那一塊比較熟悉。一看你的代碼,我就覺得很眼熟。:D
@金哥
同意你的說法。我覺得我們周圍有很多程序員都抱著這樣的想法。他們總以“不重造輪子”的觀點告誡自己,從而不知道很多東西的底層實現原理。就像有些程序員以“盲目的優化只會適得其反”這樣觀點為理由,而忽視了優化的重要性一樣。
不重造輪子,是基于你懂得造輪子的原理基礎上的。而如果你自己都不懂,連重造輪子的能力都沒有,那基本就比重造輪子的人還差了。