能力值:
( LV4,RANK:50 )
|
-
-
2 楼
:( 很不想回帖说说你的问题,但觉得你的思路有问题。
*尽善的话把 file 或 buffer 作成一个接口, ReadWord 只接受IO接口,当然文件不大比较快的方式还是直接操作buffer,故而可以做一个inline的buffer接口
*匹配有问题,为了速度为何不做张assii字符转码表呢?
*SkipWhiteSpace -> SkipSpace
*多种编码格式的文件用适配器来平衡,不应该再集合到这个小程序中。如按您所言,该类的职责已不单一了,如何增量编码
btw:
*有这份时间还不如好好写写WinMount的测试代码,以下是 WinMTExt.dll(3.3.1.20),在获取目录长度为1时直接抛异常了?给谁抓?
.text:1000D389 mov ebx, 1
.text:1000D38E mov [esp+240h+var_230], ebx
.text:1000D392 test edi, edi
.text:1000D394 jnz short loc_1000D3C2
.text:1000D396 call __invalid_parameter_noinfo
.text:1000D39B xor eax, eax
.text:1000D39D
.text:1000D39D loc_1000D39D: ; CODE XREF: sub_1000D290+134j
.text:1000D39D mov esi, [esp+240h+var_224]
.text:1000D3A1 lea ecx, [esi-4]
.text:1000D3A4 cmp ecx, [eax+10h]
.text:1000D3A7 jb short loc_1000D3AE
.text:1000D3A9 call __invalid_parameter_noinfo
.text:1000D3AE
.text:1000D3AE loc_1000D3AE: ; CODE XREF: sub_1000D290+117j
.text:1000D3AE cmp [esi+10h], ebx
.text:1000D3B1 ja short loc_1000D3B8
.text:1000D3B3 call sub_10014656
*多线程的同步也有问题,压缩文件很多时候点取消都直接死锁了,和7z模块的同步有问题,感觉对7z模块改的不兼容,个人倒觉得可以效仿haozip完全修正7z源码并发布份修改版出来,很多地方都作得不如haozip,也许您把大部分时间都花到mount这一功能上了。(感谢您提供的WinMount!)
|
能力值:
( LV4,RANK:50 )
|
-
-
3 楼
如按您所言,该类的职责已不单一了,如何增量编码
->
如按您所言,该类的职责已不单一了,已经不能谈上最优设计了
|
能力值:
( LV4,RANK:50 )
|
-
-
4 楼
看两位大牛简评,受教了
|
能力值:
( LV4,RANK:50 )
|
-
-
5 楼
*SkipWhiteSpace -> SkipSpace 自己孤陋了~~呜呼
|
能力值:
( LV2,RANK:150 )
|
-
-
6 楼
其实指出错误的同时,也应该给一些建议,觉得看看《Effective C++》这类书籍是很不错的。觉得这种方式更好。
|
能力值:
( LV15,RANK:670 )
|
-
-
7 楼
我猜都是没画流程图导致的编码乱。
GetOneWord的原型定义,可能是 void GetOneWord(OUT stl:string & s); bool GetOneWord(OUT char s[]); CString GetOneWord(); 等等。如果你写成 char * GetOneWord() 那是不好的。
前两种的话,和C没有区别,写个类只是为了简单的把三个可分离的函数拼在一起,就写不出类的优势了。
我认为这样比较好:
string GetOneWord();
bool IsLineEnd();
void skipWhiteSpace();
private:
char *m_pos;
能加强内聚,实际使用的时候也方便。
|
能力值:
( LV9,RANK:170 )
|
-
-
8 楼
回罐头:
*file 或 buffer 作成一个接口。。。我没明白你的意思
*匹配有问题。。。我没明白你的意思
*whitespace这个说法不是我提出来的,我经常见到这个说法,我理解它的意思是不只是空格,空格加制表符一起就叫 whitespace 了
*多种编码格式的文件用适配器来平衡。。。我没明白你的意思
最后,谢谢你提的WinMount的BUG。第一个BUG目录长度为1的问题已经解决。第二个多线程的同步问题,我们也会测试。以后再发现BUG欢迎报给我。
你不能说“有这份时间还不如好好写写WinMount”,我这几天在招聘新人,培训新人。今天高兴了,就写了这么个东西,希望对菜鸟能有所帮助
|
能力值:
( LV4,RANK:50 )
|
-
-
9 楼
回LiuTaoTao:
*file 接口,我指的意思是把这部分的操作分开,对接口编码,比如7z源码里很多单独的buffer操作函数,更正规的就是以输入流的代价进来,但这显然很不合算
*Space字符的匹配如果转成一张表, 比如
const unsigned char kTransTableForSpace[] =
{
4, //0, \00
0, //1,
0, //2,
0, //3,
0, //4,
0, //5,
0, //6,
0, //7,
0, //8,
4, //9, \t
4, //10, \0a
...
0 //255, ''
}
上面的\t 和0a都可以直接查表获取,如此速度总比多个 if 或者 switch 强吧(这局限assii)
*whitespace是我看得少 :)
*适配器,我说的是设计模式里的适配器模式,为的是统一编码接口
//////////////////////////////////////////////////////////////////////////////////////////////////////
你不能说“有这份时间还不如好好写写WinMount”,我这几天在招聘新人,培训新人。今天高兴了,就写了这么个东西,希望对菜鸟能有所帮助
//////////////////////////////////////////////////////////////////////////////////////////////////////
:) 还望多见谅! 其实这题我做了,但发现要做到完善要作的功夫很多,最后放弃了。
刚好今天见您发帖了,说了下我的观点。那2个bug也是这些天作了压缩的工作,看了几家的产品,顺便提上来的!
第二个我这里的调试信息如下,希望对您有帮助:
0:004> ~*kv
0 Id: bf8.a50 Suspend: 1 Teb: 7ffdf000 Unfrozen
ChildEBP RetAddr Args to Child
WARNING: Stack unwind information not available. Following frames may be wrong.
0012f74c 7c821c8d 000001ac ffffffff 00000000 ntdll!KiFastSystemCallRet
0012f760 025155f9 000001ac ffffffff 00000111 kernel32!WaitForSingleObject+0x12
0012f77c 02516be9 00000002 00000111 02574640 MouCoreUI!GetIWM_MouCoreUI+0xea9
0012f814 77e25f82 02590ff0 00710150 00000111 MouCoreUI!GetIWM_MouCoreUI+0x2499
0012f854 77e25f38 00000000 00000000 77e2b8b8 USER32!IsDialogMessageW+0x2e1
0012f860 77e2b8b8 00000000 00000000 00000000 USER32!IsDialogMessageW+0x297
00000000 00000000 00000000 00000000 00000000 USER32!LoadCursorW+0x4eca
1 Id: bf8.8d0 Suspend: 1 Teb: 7ffde000 Unfrozen
ChildEBP RetAddr Args to Child
WARNING: Stack unwind information not available. Following frames may be wrong.
01daff48 7c93e4a2 00000002 01daff70 00000000 ntdll!KiFastSystemCallRet
01daffb8 7c824829 00000000 00000000 00000000 ntdll!RtlSetLastWin32ErrorAndNtStatusFromNtStatus+0x301
01daffec 00000000 7c93e1fa 00000000 00000000 kernel32!GetModuleHandleA+0xdf
2 Id: bf8.b78 Suspend: 1 Teb: 7ffdd000 Unfrozen
ChildEBP RetAddr Args to Child
WARNING: Stack unwind information not available. Following frames may be wrong.
026cfef4 77e2bbd1 00000002 026cff1c 00000000 ntdll!KiFastSystemCallRet
026cff50 77e2ce36 00000001 026cffb0 ffffffff USER32!MsgWaitForMultipleObjectsEx+0xd7
026cff6c 4c6268ab 00000001 026cffb0 00000000 USER32!MsgWaitForMultipleObjects+0x1f
026cffb8 7c824829 00000000 00000000 00000000 gdiplus+0x68ab
026cffec 00000000 4c629605 00000000 00000000 kernel32!GetModuleHandleA+0xdf
3 Id: bf8.614 Suspend: 1 Teb: 7ffdc000 Unfrozen
ChildEBP RetAddr Args to Child
WARNING: Stack unwind information not available. Following frames may be wrong.
027ce398 77e24f0d 0087eea8 0000000c 00000000 ntdll!KiFastSystemCallRet
027ce3b8 77e17892 00400070 02ccd728 027ce3f4 USER32!SetWindowTextW+0x2d
027ce3c8 025163e8 00710150 000003f1 02ccd728 USER32!SetDlgItemTextW+0x21
027ce3f4 02b9e4d2 02ccd6d0 02e60020 000a5b05 MouCoreUI!GetIWM_MouCoreUI+0x1c98
00000000 00000000 00000000 00000000 00000000 7z!CreateObject+0x3df62
# 4 Id: bf8.914 Suspend: 1 Teb: 7ffdb000 Unfrozen
ChildEBP RetAddr Args to Child
WARNING: Stack unwind information not available. Following frames may be wrong.
02aefff4 00000000 00000000 00000000 00000000 ntdll!DbgBreakPoint
|
能力值:
( LV7,RANK:100 )
|
-
-
10 楼
刘涛涛一直是我的偶像,最近准备做编译器了吗?
发一段我写的编译器的代码,不过只处理ascii,不解析unicode
#define CHAR_ISDIGIT(c) ((c)>='0' && (c)<='9')
#define CHAR_ISCHAR(c) (((c)>='a' && (c)<='z') || ((c)>='A' && (c)<='Z'))
#define CHAR_ISHEXCHAR(c) (CHAR_ISDIGIT(c) || ((c)>='a' && (c)<='f') || ((c)>='A' && (c)<='F'))
#define CHAR_ISBLANK(c) ((c)==' '||(c)=='\t')
#define CHAR_ISEND(c) ((c)=='\0'||(c)=='\r'||(c)=='\n')
#define CHAR_ISMATHOPR(c) ((c)=='+'||(c)=='-'||(c)=='*'||(c)=='/'||(c)=='^'||(c)=='&'||(c)=='|')
#define ISFULLWORDCHAR(x) (((x)>='a'&&(x)<='z') || ((x)>='A'&&(x)<='Z') || CHAR_ISDIGIT(x) || (x) == '_' || (x) == '$')
#define SKIPBLANK(x) while((*x) == ' ' || (*x) == '\t'){(x)++;} //跳过空格和tab
/*
判断语句是否结尾
;
*/
BOOL CScript::IsEndOfLine(const char *str)
{
char* p = (char*)str;
SKIPBLANK(p);
if(CHAR_ISEND(*p))
return TRUE;
if(*p != ';')
return FALSE;
//只能是一个 ';'
p++;
SKIPBLANK(p);
if(CHAR_ISEND(*p))
return TRUE;
return FALSE;
}
|
能力值:
( LV12,RANK:210 )
|
-
-
11 楼
优秀的程序员总是能把复杂的事情条理化
赞一个
再复杂的事情只要条理化 都变得很简单
|
能力值:
( LV15,RANK:670 )
|
-
-
13 楼
居家旅行必备。
|
能力值:
( LV5,RANK:70 )
|
-
-
14 楼
受教了。
|