2010-07-29 50 views
3

对于C++的世界来说,这是一个相对较新的东西。我希望从多维SAFEARRAY访问数据。但是,当我尝试检索该值时,出现错误0xC0000005:访问冲突读取位置0x40e3e300。下面附上的是我的代码,标记的线是它出错的地方。希望有人能够阐明如何解决这个问题。从C++中的二维Safearray获得价值

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

伙计们,设法解决它。没有什么奇特的,但它在这里。

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

你的索引是不正确的在这条线:

_bstr_t theData((BSTR)DataValue[0,i],FALSE); 

在C++中的二维阵列被索引为阵列[X] [Y]。此外,索引编制从0开始,所以您可能需要修复您的错误行到像

_bstr_t theData((BSTR)DataValue[0][i-1],FALSE); 
+0

感谢您清除索引部分,不是很确定。关于从0开始的索引,我实际上希望我的循环从位置3开始,因此是偏移量。进行了这些更改,但仍然从数组中读取问题(同样的错误)。顺便说一句,该数组的维度[2] [6] ... – jw33 2010-07-29 23:08:05