描述:
如题!我用SafeArrayAccessData(psaRight,(void HUGEP **)&psa);psa中元素的顺序是按列存储的,比如psaRight是如下结构:
a b c d
e f g h
i j k l
psa中的元素就是a e i b f j c g k d h l,并且a e i后面还有个空,不知道是什么东西,b f j,c g k和d h l后面都有。请高手指点一下!
解决方案1:
其实访问二维数组与访问一维数组是一样的,只是要将二维下标转换成一维下标
我们知道,按一维数组的方式访问二维数组是这样的
int a[2][3] = {.....};
int ptr = (int *)a;
for(i = 0; i < 6; i++,ptr++)
cout<<*ptr<<endl;
是因为C中二维数组的存放方式为
a[0][0]
a[0][1]
a[0][2]
a[1][0]
a[1][1]
a[1][2]
而VB中的二维数组是以SafeArray方式存储的即
Dim a(1,2) as Integer
存储顺序为
a(0,0)
a(1,0)
a(0,1)
a(1,1)
a(0,2)
a(1,2)
按照这个规律你再看看你写的结果应该能明白了吧.
up
解决方案3: here is another example in which we create a 10 row by 15 column array of variant elements:
VARIANT v;
v.vt = VT_ARRAY | VT_VARIANT;
SAFEARRAYBOUND sab[2];
sab[0].lLbound = 1; sab[0].cElements = 10;
sab[1].lLbound = 1; sab[1].cElements = 15;
v.parray = SafeArrayCreate(VT_VARIANT, 2, sab);
// Fill with some values...
for(i=1; i<=10; i++) {
for(int j=1; j<=15; j++)
{
// Create entry value for (i,j)
VARIANT tmp;
tmp.vt = VT_I4;
tmp.lVal = i*j;
// Add to safearray...
long indices[] = {i,j};
SafeArrayPutElement(v.parray, indices, (void *)&tmp);
}
}
VaraintClear(&v)