对C ++世界来说相对较新。我希望从多维SAFEARRAY访问数据。但是,当我尝试检索该值时,我得到错误0xC0000005:访问冲突读取位置0x40e3e300。下面是我的代码,标记的行是它出错的地方。希望有人可以解释如何解决它。
SAFEARRAY *ArrayCrosstabInfo = GetMainFrame().m_epsComHelper->GetCrosstab(m_arrayFieldnames,start,end);
COleSafeArray ArrayCrosstab(*ArrayCrosstabInfo,VT_SAFEARRAY);
BSTR *DataValue;
ArrayCrosstab.AccessData((void**) &DataValue);
long lUBoundX;
long lUBoundY;
ArrayCrosstab.GetUBound(1,&lUBoundX);
ArrayCrosstab.GetUBound(2,&lUBoundY);
long lOffset = 2;
int nFieldIndex = 0;
if (lUBoundX > 0 && lUBoundY > 0)
{
//only interested in DataValue[0,x]
for (long i = lOffset; i<=lUBoundY; i++)
{
_bstr_t theData((BSTR)DataValue[0,i],FALSE); <==ERRORS HERE
//Display (BSTR)theData;
}
}
答案 0 :(得分:2)
伙计们,设法解决了这个问题。没有什么花哨但在这里。
SAFEARRAY *ArrayCrosstabInfo = GetMainFrame().m_epsComHelper->GetCrosstab(m_arrayFieldnames,start,end);
int lOffset = 2;
long index[2];
long lUBoundX;
long lUBoundY;
SafeArrayGetUBound(ArrayCrosstabInfo, 1, &lUBoundX);
SafeArrayGetUBound(ArrayCrosstabInfo, 2, &lUBoundY);
if (lUBoundX >= 0 && lUBoundY >= 0)
{
double theResult = 0;
for (long i=lOffset; i<=lUBoundY; i++)
{
index[0] = 0;
index[1] = i;
SafeArrayGetElement(ArrayCrosstabInfo, index, &theResult);
std::ostringstream strs;
strs << theResult;
std::string str = strs.str();
CString cs(str.c_str());
//display cs
}
}
答案 1 :(得分:1)
你的索引在这一行上不正确:
_bstr_t theData((BSTR)DataValue[0,i],FALSE);
在C ++中,二维数组被索引为array [x] [y]。此外,索引从0开始,因此您可能需要将错误的行修复为类似
的行_bstr_t theData((BSTR)DataValue[0][i-1],FALSE);