从C ++中的二维Safearray中获取价值

时间:2010-07-29 06:56:39

标签: c++ safearray

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

2 个答案:

答案 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);