首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SAPI如何识别多个属性

SAPI如何识别多个属性
EN

Stack Overflow用户
提问于 2015-12-18 03:27:41
回答 1查看 138关注 0票数 1

我正在尝试编写代码来识别一个短语中的多个属性。短语在说出来的时候已经可以识别了;但是,我需要知道去哪里;在本例中,一个特定的case = case PONY:。我有几个问题,它崩溃后,它到达的情况。它说这是一个坏的指针,我不确定如何修复它。到目前为止,这就是我所做和尝试的。任何帮助都会很棒!

C++代码片段

代码语言:javascript
运行
复制
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代码片段

代码语言:javascript
运行
复制
<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>

代码语言:javascript
运行
复制
<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>`

这些是这样的短语:“雌性棕马是稳定的”“雌性黑马是不稳定的”“雌性黑马是不稳定的”“雄性棕马是稳定的”“雄性黑马是稳定的”“雄性棕马是不稳定的”“雄性黑马不稳定”

EN

回答 1

Stack Overflow用户

发布于 2016-01-05 04:55:11

我有两个(C++)函数,我在使用过的每个项目中都使用过它们。

代码语言:javascript
运行
复制
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;
}

你可以这样称呼它:

代码语言:javascript
运行
复制
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;
}

最后,你的语法结构很糟糕。您希望具有不同值的相同属性。如下所示:

代码语言:javascript
运行
复制
<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")来获取这匹小马的性别。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34342691

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档