我正在尝试编写代码来识别一个短语中的多个属性。短语在说出来的时候已经可以识别了;但是,我需要知道去哪里;在本例中,一个特定的case = case PONY:。我有几个问题,它崩溃后,它到达的情况。它说这是一个坏的指针,我不确定如何修复它。到目前为止,这就是我所做和尝试的。任何帮助都会很棒!
C++代码片段
const SPPHRASEPROEPRTY* FindPropertyCore(Const SPPHRASEPROEPRTY* pProp, LPCWSTR propName) {
while (pProp != NULL) {
if (wcscmp(propName, pProp->pszName)==0) {
return pProp ;
}
if (pProp->pFirstChild != NULL) {
const SPPHRASEPROEPRTY* pChild = FindProperty(pProp->pFirstChild, propName) ;
if (pChild) {
return pChild ;
}
}
pProp = pProp->pNextSibling ;
}
return pProp ;
}
const SPPHRASEPROEPRTY* FindProperty(const SPPHRASE* pPhrase, LPCWSTR propName) {
return FindPropertyCore(pPhrase->pProperties, propName)
}
SPPHRASE* pPhrase = NULL ;
HRESULT OnRecognition(ISpRecoResult* pRecoResult) {
SPPHRASE* pPhrase (NULL) ;
HRESULT hr = pRecoResult->GetPhrase(&pPhrase) ;
if (SUCCEEDED(hr)) {
const SPPHRASEPROEPRTY* pProperty = FindProperty(pPhrase, L"/*blank for now, but a word(s) would go in here*/");
if (pProperty != NULL) {
//stuff
}
::CoTaskMemFree(pPhrase) ;
}
return hr ;
}
std::wstring processPhrase(ISpPhrase *pPhrase, HWND hWnd) {
SPPHRASE *pElements ;
std::wstring str ;
}
if (SUCCEEDED(pPhrase->GetPhrase(&pElements)))
{
SPPHRASE phrase = *pElements ;
WCHAR *pText ;
if (SUCCEEDED(pPhrase->GetText(SP_GETWHOLEPHRASE, SP_GETWHOLEPHRASE, TRUE, &pText, NULL))) {
str = pText ;
}
switch ( pElements->Rule.ulId) {
case CAT_PONIES:
HRESULT hr = pRecoResult->GetPhrase(&pPhrase) ;
if (SUCCEEDED(hr)) {
const SPPHRASEPROEPRTY* pProperty = FindProperty(pPhrase, L"");
if (pProperty != NULL) {
//stuff
}
break ;
::CoTaskMemFree(pPhrase) ;
}
return hr ;
}
}
XML代码片段
<RULE NAME="PONIES" ID="CAT_PONIES" TOPLEVEL="ACTIVE">
<L>
<P>
<O>
<L>
<P PROPID="FEMALE" VALSTR="female">female</P>
<P PROPID="MALE" VALSTR="male">male</P>
</L>
</O>
<RULEREF NAME="BROWN_BLACK"/>
<P>pony</P>
<O>
<L>
<RULEREF NAME="STABLED"/>
</L>
</O>
</P>
</L>
</RULE>
<RULE NAME="BROWN_BLACK" ID="R_BROWN_BLACK">
<L>
<P PROPID="BROWN" VALSTR="brown">brown</P>
<P PROPID="BLACK" VALSTR="black">black</P>
</L>
<RULE NAME="STABLED" ID="R_STABLED">
<L>
<P PROPID="STABLED" VALSTR="stabled">stabled</P>
<P PROPID="NOT_STABLED" VALSTR="not stabled">not stabled</P>
</L>
</RULE>`
这些是这样的短语:“雌性棕马是稳定的”“雌性黑马是不稳定的”“雌性黑马是不稳定的”“雄性棕马是稳定的”“雄性黑马是稳定的”“雄性棕马是不稳定的”“雄性黑马不稳定”
发布于 2016-01-05 04:55:11
我有两个(C++)函数,我在使用过的每个项目中都使用过它们。
const SPPHRASEPROPERTY* FindProperty(const SPPHRASE* pPhrase, LPCWSTR propName) const
{
return FindPropertyCore(pPhrase->pProperties, propName);
}
const SPPHRASEPROPERTY* FindPropertyCore(const SPPHRASEPROPERTY* pProp, LPCWSTR propName) const
{
while (pProp != NULL)
{
if (wcscmp(propName, pProp->pszName) == 0)
{
return pProp;
}
if (pProp->pFirstChild != NULL)
{
const SPPHRASEPROPERTY* pChild = FindPropertyCore(pProp->pFirstChild, propName);
if (pChild)
{
return pChild;
}
}
pProp = pProp->pNextSibling;
}
return pProp;
}
你可以这样称呼它:
HRESULT OnRecognition(ISpRecoResult* pRecoResult)
{
SPPHRASE* pPhrase(NULL);
HRESULT hr = pRecoResult->GetPhrase(&pPhrase);
if (SUCCEEDED(hr))
{
const SPPHRASEPROPERTY* pProperty = FindProperty(pPhrase, "FEMALE");
if (pProperty != NULL)
{
// stuff
}
::CoTaskMemFree(pPhrase);
}
return hr;
}
最后,你的语法结构很糟糕。您希望具有不同值的相同属性。如下所示:
<RULE NAME="PONIES" ID="CAT_PONIES" TOPLEVEL="ACTIVE">
<L>
<P>
<O>
<L>
<P PROPNAME="GENDER" VALSTR="female">female</P>
<P PROPNAME="GENDER" VALSTR="male">male</P>
</L>
</O>
<RULEREF NAME="BROWN_BLACK"/>
<P>pony</P>
<O>
<L>
<RULEREF NAME="STABLED"/>
</L>
</O>
</P>
</L>
</RULE>
<RULE NAME="BROWN_BLACK" ID="R_BROWN_BLACK">
<L>
<P PROPNAME="COLOR" VALSTR="brown">brown</P>
<P PROPNAME="COLOR" VALSTR="black">black</P>
</L>
<RULE NAME="STABLED" ID="R_STABLED">
<L>
<P PROPNAME="STABLED" VALSTR="stabled">stabled</P>
<P PROPNAME="STABLED" VALSTR="not stabled">not stabled</P>
</L>
</RULE>`
现在您可以调用FindProperty(pPhrase, L"STABLED")
来查看这匹小马是否已经稳定;调用FindProperty(pPhrase, L"COLOR")
来获取这匹小马的颜色,或者调用FindProperty(pPhrase, L"GENDER")
来获取这匹小马的性别。
https://stackoverflow.com/questions/34342691
复制相似问题