Variant和SafeArray使用


//define
VARIANT varChunk;
VariantInit(&varChunk);
const long lElements = 20;
const long lDims = 2;
SAFEARRAY *psa = NULL;
SAFEARRAYBOUND rgsabound[lDims];//维度,数量
rgsabound[0].lLbound = 8;//下标起始位置
rgsabound[0].cElements = 2;//数量


rgsabound[1].lLbound = 10;//下标起始位置
rgsabound[1].cElements = lElements;//数量


psa = SafeArrayCreate(VT_R8, lDims, rgsabound);


long llb1 = 0;
long lhb1 = 0;
SafeArrayGetLBound(psa, 1, &llb1);//8
SafeArrayGetUBound(psa, 1, &lhb1);//9


long llb2 = 0;
long lhb2 = 0;
SafeArrayGetLBound(psa, 2, &llb2);//10
SafeArrayGetUBound(psa, 2, &lhb2);//29

//data
srand(time(NULL)); //use current time as seed for random generator
double dSimulData[lElements];
for (long lIndex = 0; lIndex < lElements; ++lIndex)
{
dSimulData[lIndex] = rand();
}


//不按照维度赋值,按内存区赋值
double *buf;
double *pData = dSimulData;
SafeArrayAccessData(psa, (void **)&buf);
for (long l = 0; l <40; ++l)
{
if ( l == 20)
{
pData = dSimulData;//
}


*buf++ = *pData++;
}


SafeArrayUnaccessData(psa);




//赋值
//long lDim[2] = {0, 0};
//for (int i = 8; i <= lhb1; ++i)
//{
// lDim[0] = i;
// for (int j = 10; j <= lhb2; ++j)
// {
// lDim[1] = j;
// if (i == 8)
// {
// SafeArrayPutElement(psa, lDim, &dSimulData[j-10]);
// }
// else
// {
// SafeArrayPutElement(psa, lDim, &dSimulData[29-j]);
// }
// }


//}


//转存到Variant中
varChunk.vt = VT_ARRAY|VT_R8;
varChunk.parray = psa;




//读取
//double *dbuf;
//SafeArrayAccessData(varChunk.parray, (void **)&dbuf);
//double dTemp = 0.0; 
//for (long l = 0; l <lElements; ++l)
//{
// dTemp = *dbuf++;//无维度区分,由列维度开始
// //8,10-9,10 
// //8,11-9,11
//}
//SafeArrayUnaccessData(varChunk.parray);




//读取2
double *dbuf;
SafeArrayAccessData(varChunk.parray, (void **)&dbuf);
long lDim[2] = {0, 0};
double dTemp = 0;
for (int i = 8; i <= lhb1; ++i)
{
lDim[0] = i;
for (int j = 10; j <= lhb2; ++j)
{
lDim[1] = j;
SafeArrayGetElement(varChunk.parray, lDim, &dTemp);
}
}
SafeArrayUnaccessData(varChunk.parray);
SafeArrayDestroy(psa);
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值