C 使用VARIANT實現二維陣列的操作

2021-09-20 01:27:12 字數 3180 閱讀 8727

variant變數是com元件之間互相通訊的重要的引數變數之一,它可以容納多種不同的型別,如short、long、double等,包括各類指標和陣列。元件之間的互相呼叫是比較耗時的,尤其帶噹元件位於不同程序中時,因此,減少傳遞次數是提高效率的一種有效方法。其中,excel**的操作就可能涉及到大量資料,一次傳遞乙個二維陣列是提高對excel表的操作效率。下面以兩種不同方式來實現variant二維陣列的操作。

1、使用safearray實現二維陣列

safearray安全陣列可以實現多維陣列,safearray實現的步驟可以大致分為三步。

(1)建立safearray安全陣列,包括設定陣列元素的型別、資料的維數,大小等。

(2)對safearray陣列賦值,既可通過safearrayputelement函式逐個元素進行負責,也可通過指標來獲得safearray的資料位址,然後對指標指向的值進行賦值操作。其中,如果safearray中的陣列時多維陣列,即可以把多維陣列轉換為一維陣列,也可以通過獲得指向陣列的指標方式來運算元組中的元素。

(3)使用variant變數把safearray進行包裝。

使用safearrar實現二維陣列的源**如下:

vartype vt = vt_i4; /*陣列元素的型別,long*/

safearraybound sab[2]; /*用於定義陣列的維數和下標的起始值*/

sab[0].celements = 2;

sab[0].llbound = 0;

sab[1].celements = 2;

sab[1].llbound = 0;

/*建立乙個2*2的型別為long的二維陣列*/

safearray* psa = safearraycreate(vt, sizeof(sab)/sizeof(safearraybound), sab);

if (null == psa)

/*通過指向陣列的指標來對二維陣列的元素進行間接賦值*/

long (*parray)[2] = null;

hresult hret = safearrayaccessdata(psa, (void **)&parray);

if (failed(hret))

memset(parray, 0, 2*2*sizeof(long));

/*釋放指向陣列的指標*/

safearrayunaccessdata(psa);

parray = null;

/*對二維陣列的元素進行逐個賦值*/

long index[2] = ;

long lfirstlbound = 0;

long lfirstubound = 0;

long lsecondlbound = 0;

long lsecondubound = 0;

safearraygetlbound(psa, 1, &lfirstlbound);

safearraygetubound(psa, 1, &lfirstubound);

safearraygetlbound(psa, 2, &lsecondlbound);

safearraygetubound(psa, 2, &lsecondubound);

for (long i = lfirstlbound; i <= lfirstubound; i++)}}

/*把safearray轉換為variant*/

variant var;

var.vt = vt_array | vt; /*vt必須和psa的資料型別保持一致*/

var.parray = psa;

safearraydestroy(psa);

psa = null;

2、使用colesafearray實現二維陣列

colesafearray繼承於variant,是mfc的自動化類,因此,只有在使用mfc類庫時才能使用該類。colesafearray封裝操作相關的函式,可通過msdn查詢該類的成員函式來了解與安全陣列相關的函式。colesafearray還可以直接轉換為variant。因此,相對於safearray,colesafearray的使用更方便。colesafearray和safearray之間的關係就是mfc類庫和win32 sdk的關係,使用步驟類似。

使用colesafearray實現二維陣列的源**如下所示:

vartype vt = vt_i4; /*陣列元素的型別,long*/

safearraybound sab[2]; /*用於定義陣列的維數和下標的起始值*/

sab[0].celements = 2;

sab[0].llbound = 0;

sab[1].celements = 2;

sab[1].llbound = 0;

colesafearray olesa;

olesa.create(vt, sizeof(sab)/sizeof(safearraybound), sab);

/*通過指向陣列的指標來對二維陣列的元素進行間接賦值*/

long (*parray)[2] = null;

olesa.accessdata((void **)&parray);

memset(parray, 0, 2*2*sizeof(long));

/*釋放指向陣列的指標*/

olesa.unaccessdata();

parray = null;

/*對二維陣列的元素進行逐個賦值*/

long index[2] = ;

long lfirstlbound = 0;

long lfirstubound = 0;

long lsecondlbound = 0;

long lsecondubound = 0;

olesa.getlbound(1, &lfirstlbound);

olesa.getubound(1, &lfirstubound);

olesa.getlbound(2, &lsecondlbound);

olesa.getubound(2, &lsecondubound);

for (long i = lfirstlbound; i <= lfirstubound; i++)

}

/*把colesafearray變數轉換為variant*/

variant var = (variant)olesa;

參考資料

C 二維vector使用

在stl中vector這一容器,無論是在封裝程度還是記憶體管理等方面都由於傳統c 中的陣列。本文主要是關於使用vector初始化 遍歷方面的內容。其他二維的思想也是類似的。int p p new int 10 注意,int 10 表示乙個有10個元素的指標陣列 for int i 0 i 10 i ...

c 二維陣列賦值及二維指標使用

include void main int tmp 2 test printf value d n tmp 0 printf value d n tmp 0 printf value d n tmp 1 printf value d n tmp 1 printf value d n tmp 0 1 ...

使用Vector實現二維陣列

from xheartblue.home.chinaren.com 用vector取代c style的陣列 提起陣列,大家想必都很熟悉,你可以用索引和指標來運算元組,給程式設計帶來了很大的靈活性。但是你知道它有許多天生的缺陷嗎?首先,陣列的越界可能會引起程式的崩潰 如果崩潰了,還算你走運 其次是動態...