您的位置:首页 > Web前端

SAFEARRAY向一维、二维数组转换

2008-08-07 21:30 92 查看
 
         这里说明二维数组向SAFEARRAY转换的方法。二维转换如果会了, 一维转换原理相同,只是指定SafeArrayGetElement的索引(第二个参数)不同。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

         // 定义动态的二维数组

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;

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  delete 测试 存储