描述:
有一个safeArray的二维数组,我想copy到一个int的二维数组
我现在用的是
for()
{
for()
{
用GetElement()赋值
}
}
有没有办法一次性copy到int数组?
谢谢了!
解决方案1:
short pMyOriginalData[2][3][4][5];
HRESULT hr;
//initialize data
for(short a = 0; a < 2; a++)
for(short b = 0; b < 3; b++)
for(short c = 0; c < 4; c++)
for(short d = 0; d < 5; d++)
pMyOriginalData[a][b][c][d] = a*b*c*d;
SAFEARRAY* pMyArray;
SAFEARRAYBOUND rgsabound[4];
for(int count = 2; count < 6; count++)
{
rgsabound[count - 2].lLbound = 0;
rgsabound[count - 2].cElements = count;
}
pMyArray = SafeArrayCreate(VT_I2, 4, rgsabound);
short* pData;
hr = SafeArrayAccessData(pMyArray, (void**)&pData);
memcpy(pData, pMyOriginalData, 2*3*4*5*2);
short element;
long location[4] = {1,2,3,4};
hr = SafeArrayGetElement(pMyArray, location, (void*)&element);
ASSERT(element == 1*2*3*4);
hr = SafeArrayDestroy(pMyArray);
ASSERT(hr != S_OK);
hr = SafeArrayUnaccessData(pMyArray);
hr = SafeArrayDestroy(pMyArray);
ASSERT(hr == S_OK);
这是个4维的,一个意思,自己改改就可以了!
void CopySafeArray(SAFEARRAY* pSa)
{
UINT Dim = ::SafeArrayGetDim(pSa);
// ASSERT(Dim == 2);
UINT ElementSize = ::SafeArrayGetElemsize(pSa);
// ASSERT(ElementSize == sizeof(int));
LONG LBound1, UBound1;
::SafeArrayGetLBound(pSa, 1, &LBound1);
::SafeArrayGetUBound(pSa, 1, &UBound1);
LONG LBound2, UBound2;
::SafeArrayGetLBound(pSa, 2, &LBound2);
::SafeArrayGetUBound(pSa, 2, &UBound2);
UINT m = UBound1 - LBound1 + 1;
UINT n = UBound2 - LBound2 + 1;
int* Array = new int[m*n];
LONG* pvData = NULL;
::SafeArrayAccessData(pSa, (void**)&pvData);
memcpy(Array, pvData, sizeof(LONG) * (m*n));
::SafeArrayUnaccessData(pSa);
//Array中就是数据
delete[] Array;
}