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