SAFEARRAY向一维、二维数组转换

本文详细介绍了如何将二维数组转换为SAFEARRAY,并提供了一段C++代码示例,展示了如何从SAFEARRAY中提取数据并进行测试。通过SafeArrayGetDim、SafeArrayGetUBound、SafeArrayGetLBound等函数获取数组信息,使用SafeArrayGetElement提取元素,并展示如何释放内存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

         这里说明二维数组向SAFEARRAY转换的方法。二维转换如果会了, 一维转换原理相同,只是指定SafeArrayGetElement的索引(第二个参数)不同。

 

         // 定义动态的二维数组

VARIANT** arg3;

:这里必须是VARIANT类型,否则在执行SafeArrayGetElement时,用于存储数据的本地数组(第三个参数)下标不是从0开始,这样就会出问题。

 

// 假设varRet中是从double型二维数组转换而来的。下面从SAFEARRAY中提取数据。

 

         // 获得SAFEARRAY的信息

         // 获得维数

         UINT uDim = SafeArrayGetDim( varRet.parray );

         // 获得元素大小,这个没什么用

         UINT uEleSize = SafeArrayGetElemsize( varRet.parray );

         // 获得一维的下界和上界

         long nDim1UBound;

         long nDim1LBound;

         SafeArrayGetUBound( varRet.parray, 1, &nDim1UBound );

         SafeArrayGetLBound( varRet.parray, 1, &nDim1LBound );

         // 获得二维的下界和上界

         long nDim2UBound;

         long nDim2LBound;

         SafeArrayGetUBound( varRet.parray, 2, &nDim2UBound );

         SafeArrayGetLBound( varRet.parray, 2, &nDim2LBound );

         // 计算元素个数,分配空间使用

         long nDim1Count = nDim1UBound - nDim1LBound + 1;

         long nDim2Count = nDim2UBound - nDim2LBound + 1;

 

         // 分配空间

         arg3 = new VARIANT *[ nDim1Count];

         for ( int nn = 0; nn < nDim1Count; nn++ )

         {

                   arg3[nn] = new VARIANT[nDim2Count];

         }      

 

         // 转换

         int x = 0;

         int y = 0;

         for ( long nDim1 = nDim1LBound; nDim1 <= nDim1UBound; nDim1++ )

         {

                   lIndex[0] = nDim1;

                   y = 0;

                   for ( long nDim2 = nDim2LBound; nDim2 <= nDim2UBound; nDim2++ )

                   {

                            lIndex[1] = nDim2;

                            SafeArrayGetElement (varRet.parray, lIndex, &arg3[x][y]); //

                            y++;

                   }

                   x++;

         }

 

// 输出测试结果

    for (  i = 0; i < nDim1UBound; i++ )

    {

         for ( int j = 0; j < nDim2UBound; j++ )

         {

             CString strMsg;

             strMsg.Format( _T( "%f" ), arg3[i][j].dblVal );

             AfxMessageBox( strMsg );

         }

    }

 

// 释放内存

    SafeArrayDestroyData( psa );

 

    for ( nn = 0; nn < nDim1Count; nn++ )

    {

         delete[] arg3[nn];

    }

    delete arg3;

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值