2010-07-29 20 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