Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ SAPI如何识别多个属性_C++_Sapi - Fatal编程技术网

C++ SAPI如何识别多个属性

C++ SAPI如何识别多个属性,c++,sapi,C++,Sapi,我正在尝试编写代码来识别一个短语中的多个属性。口语中已经可以识别的短语;然而,我需要它知道去哪里;在本例中,特定案例=案例小马:。我有一些问题,一旦它达到案件崩溃。它说这是一个错误的指针,我不知道如何修复它。这就是我迄今为止所做和尝试的。任何帮助都会很棒 C++代码段 const SPPHRASEPROEPRTY* FindPropertyCore(Const SPPHRASEPROEPRTY* pProp, LPCWSTR propName) { while (pProp != NULL)

我正在尝试编写代码来识别一个短语中的多个属性。口语中已经可以识别的短语;然而,我需要它知道去哪里;在本例中,特定案例=案例小马:。我有一些问题,一旦它达到案件崩溃。它说这是一个错误的指针,我不知道如何修复它。这就是我迄今为止所做和尝试的。任何帮助都会很棒

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 ;
   }
}
<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>
XML代码片段

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 ;
   }
}
<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>

女性 男性

小马

布朗 黑色


稳定

不稳定 `

以下是短语: “雌性棕色小马被关在马厩里” “雌性黑马被关在马厩里” “雌性棕色小马没有马厩” “雌性黑小马没有被关在马厩里” “雄性棕色小马被关在马厩里” “雄性黑小马被关在马厩里” “雄性棕色小马没有马厩” “雄性黑小马不是马厩”

我有一对(C++)函数,我几乎在我使用过的每个SAPI识别项目中都使用过

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>`
最后,你的语法结构很糟糕。您希望具有具有不同值的相同属性。大概是这样的:

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(短语,L“STABLED”)
查看小马是否已被固定
FindProperty(pPhrase,L“COLOR”)
获取小马的颜色,或者
FindProperty(pPhrase,L“GENDER”)
获取小马的性别。

你的指针都初始化了吗(而不是
nullptr
)?@Jarod42-我在以前的版本中这样做了,它在崩溃时给了我相同的错误消息<代码>常量SPPHRASEPROPERTY*pProp=NULL;常量SPPHRASERULE*pRule=NULL
if(pRule!=NULL){if(phrase.pProperties->pFirstChild->pszValue!=NULL&&wcscmp(L“female”,phrase.pProperties->pFirstChild->pszValue)!=NULL){//如果做某事(wcscmp(L“brown”,phrase.pProperties->pFirstChild->pNextSibling->pszName)=0){//如果做某事}(L“black”,phrase.pProperties->pszName)){//do something}
注释不适用于所有非内联代码。如果需要,您可以使用相关代码编辑您的问题。提供的代码在您使用
nullptr
初始化时不起任何作用,但如果不是
nullptr
,请执行操作…@Jarod42-因此,为了澄清并纠正我的错误,指针的初始化实际上是这样做的我想要的操作必须是
!=nullptr
?是的,不确定在您的情况下是否也需要指针。我从您提供的代码中得到一些错误。在第一行,它说“const-SPPHRASEPROPERTY*”与类型为“const-SPPHRASE*”的参数不兼容。此外,“FindProperty”还有一个错误消息说本地函数定义是非法的"。我不了解这些错误或如何修复它们。请提供解释和解决方案。请尝试反转函数的顺序,或添加前向声明。此外,您似乎已将代码粘贴到现有函数的中间,因此出现了“本地函数定义非法”错误。好的,我知道是什么我犯了这些错误,谢谢。但是,如果我有两个类别:小马和母牛呢?我是否需要在每种情况下包含代码的第二个片段?多少次/词组?我编辑了我的代码。请看一看。例如,如果这些词组是可以选择的:雌性棕色小马是稳定的雌性black pony是stabled雌性棕色pony不是stabled雌性黑色pony不是stabled对于要检索的每个属性,您将调用FindProperty一次。在上面的代码段中,OnRecognition方法是多余的。查看语法示例,看起来您使用的是PROPID而不是PROPNAME;这是完全有效的,但它是多余的这意味着属性将以数字而不是字符串的形式返回。我将更改语法以使用PROPNAME。还添加了语法更改以使用一致的属性名称集。