导航:
论坛 -> DELPHI技术
斑竹:liumazi,sephil
作者:
2018/1/24 12:44:55
标题:
加入我的收藏
楼主:
代码如下: type PJiebaWord = ^CJiebaWord; CJiebaWord = record word: Pansichar; len: cardinal; end; var Ahandle: Thandle; pw, words: pjiebaword; tag: RawByteString; begin Ahandle := NewJieba(); txt := '测试例句'; words := Cut(Ahandle, PAnsiChar(txt)); pw := words; while (nil <> pw) and (nil <> pw^.word) do begin //省略 inc(pw); end; FreeWords(words); //这是API提供的函数 FreeJieba(Ahandle); end; ========== 例子中的FreeWords是接口提供的函数,但在XE6及以后,到底有没有必要手动释放words这个结构指针?应该是自动释放的吧? 之所以有此疑惑,是因为上述代码在有的程序中工作正常,放到有的程序中FreeWords会出错。
----------------------------------------------
-
作者:
2018/1/24 17:14:30
1楼:
兰州听谁说会自动释放的? 原生程序,屁股都要自己擦。编译器不会帮你擦这种屁股。 另外就是,之前都给你翻译过一个定义,你自己一定要丢弃,一定要自己搞,那就要自己去核对两边的翻译是否到位。
----------------------------------------------
--
作者:
2018/1/24 17:43:07
2楼:
谢谢1楼的帮助。 这是你翻译的代码 type pjiebaword = ^tjiebaword; tjiebaword = record word: lpcstr; {$ifdef cpux64} len: uint64; {$else} len: uint; {$endif} end; 其中的类型都是DELPHI不支持的,所以我修改了一下。 你提供的包里那个PAS文件是用headcov自动转换的吧,那个不能直接用,我改了一个接口PAS。 这是地址 http://bbs.2ccc.com/attachments/2018/badwood_201812112103.rar 测试使用的代码根据结巴的DEMO和参考你翻译的代码制作的,我建立单独的测试程序可以正常执行。 但将同样代码放在另一个程序(非多线程)里 FreeWords(words); 就会报错。 我看了C++源码,FreeWords就是简单的释放 void FreeWords(CJiebaWord* words) { free(words); } 找不到释放这个指针会报错的原因。 测试代码 ========== type PJiebaWord = ^CJiebaWord; CJiebaWord = record word: Pansichar; len: cardinal; end; var DICT_PATH, HMM_PATH, USER_DICT, IDF_PATH, STOP_WORDS_PATH: ansistring; Ahandle: Thandle; txtlen: cardinal; txt,newtxt: ansistring; pw, words: pjiebaword; tag: RawByteString; begin DICT_PATH := './jiebadict/jieba.dict.utf8'; HMM_PATH := './jiebadict/hmm_model.utf8'; USER_DICT := './jiebadict/user.dict.utf8'; IDF_PATH := './jiebadict/idf.utf8'; STOP_WORDS_PATH := './jiebadict/stop_words.utf8'; Ahandle := NewJieba(PAnsiChar(DICT_PATH), PAnsiChar(HMM_PATH), PAnsiChar(USER_DICT), PAnsiChar(IDF_PATH), PAnsiChar(STOP_WORDS_PATH)); txt := trim(Msource.Text); txt := utf8encode(txt); txtlen := length(txt); words := Cut(Ahandle, PAnsiChar(txt), txtlen); newtxt := ''; pw := words; while (nil <> pw) and (nil <> pw^.word) do begin tag := UTF8Decode(leftstr(pw^.word, pw^.len)); newtxt := newtxt + tag + '/'; inc(pw); end; Mdest.Lines.Append(newtxt); FreeWords(words); FreeJieba(Ahandle);
----------------------------------------------
-
作者:
2018/1/24 17:50:55
3楼:
楼上胡说。 人家的类型 DELPHI 都支持的。
----------------------------------------------
(C)(P)Flying Wang
作者:
2018/1/24 18:05:35
3楼:
反复测试后发现是执行了 pw := words; 这一句后, FreeWords(words); 就会报错。 这样能正常释放: words := Cut(Ahandle, PAnsiChar(txt), txtlen); FreeWords(words); 下列代码释放就会报错(放在其他程序里时): words := Cut(Ahandle, PAnsiChar(txt), txtlen); pw := words; //问题出在这里 FreeWords(words); 所以,C++的下列代码在delphi中应该怎么写才正确呢。 CJiebaWord* words = Cut(handle, s, len); CJiebaWord* x; for (x = words; x && x->word; x++) { printf("%*.*s\n", x->len, x->len, x->word); } FreeWords(words); FreeJieba(handle);
----------------------------------------------
-
作者:
2018/1/24 18:10:00
4楼:
@ wang_80919 是我无知了,因为搜索帮助没找到lpcstr就以为不支持。
此帖子包含附件: 大小: 83.4K
----------------------------------------------
-
作者:
2018/1/24 18:19:26
5楼:
按照bahamut8348 的代码修改了接口定制,但3楼描述的问题仍然存在 Project test.exe raised exception class $C0000005 with message 'access violation at 0x25fde01c: read of address 0x25fde01c'.
----------------------------------------------
-
作者:
2018/1/24 19:29:36
6楼:
所以说吧,兰州基本不看人家的说明的。 之前帮你打包的时候就已经说了,没有修改约定,全部都是cdecl。 兰州看看自己的定义是怎么写的。。。
此帖子包含附件: 大小: 46.6K
----------------------------------------------
--
作者:
2018/1/24 20:29:04
7楼:
不是不看,是有看没有懂啊,这个是在headcov翻译的接口基础上改来的。 去掉了 stdcall ,现在OK了,感谢bahamut8348。
----------------------------------------------
-