问一个数组问题?

现在还是人类 2008-05-06 06:32:18
我想在VC中实现类似VB的Redim效果,就是数组范围的重定义
以下是VB的代码,我想问,如果用VC来写该如何做呢?
Private Type BBType
A As Long
B As Integer
End Type
Private Sub Command1_Click()
Dim UU() As BBType
Dim UULen As Long
Dim UUU As String
Dim TempStr1() As String
Dim TempStr2() As String
Dim X As Long
UUU = "78567:13|29856:356|776545:13|25565:765|8456:13"
TempStr1 = Split(UUU, "|")
UULen = 0
For X = LBound(TempStr1) To UBound(TempStr1)
TempStr2 = Split(TempStr1(X), ":")
If Int(TempStr2(1)) = 13 Then
If UULen = 0 Then
ReDim UU(UULen)
Else
ReDim Preserve UU(UULen)
End If
UU(UULen).A = TempStr2(0)
UU(UULen).B = X
UULen = UULen + 1
End If
Next X
Cls
For X = 0 To UBound(UU)
Print UU(X).A & " - " & UU(X).B
Next X
End Sub
...全文
270 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
jameshooo 2008-05-13
  • 打赏
  • 举报
回复
如果不怕麻烦,直接使用SafeArrayxxx系列API;
如果希望使用简单,使用ATL提供的封装类CComSafeArray,不过这个封装类在VC6中是没有的,可以从别人机器复制atlsafearray.h头文件过来就能用了
jameshooo 2008-05-13
  • 打赏
  • 举报
回复
申明在Oleauto.h文件中,要引用Oleaut32.lib库文件,不过这个库是操作系统带的,vc里不需要显式包含和引用,能直接使用。

SafeArray是为COM设计的,因为要满足语言无关特性和数据列集的需求。实际上COM使用的所有复杂数据类型都一个重要特征:结构自身除了包含有效数据外,还会包含数据的描述信息,比如SafeArray内部结构会包含数组元素的类型、数组维数、每维数的个数等等;VARIANT会包含vt表示数据类型;BSTR会包含一个表示字符串内存长度的整数。
由于SafeArray的内部结构相对比较复杂,微软提供了一系列API来操作数组,内部结构被隐藏起来了,就是为了防止错误的发生,另外由于数组变化时经常涉及到内存的重新分配,封装在同一个模块中不会引起执行错误。
现在还是人类 2008-05-13
  • 打赏
  • 举报
回复
没想到VC的数组操作竟然要借助API
想问一下SafeArrayxxx系列API在哪一个DLL里呢?
能给个简单的使用范例或说明吗?
现在还是人类 2008-05-12
  • 打赏
  • 举报
回复
能不能写个例子出来?连要引用什么头我都不知道。
而且我的不是MFC,能用吗?
888atao 2008-05-09
  • 打赏
  • 举报
回复
14正解,VB里的数组对应到VC里面,就是SAFEARRAY
看看ATL方面有关SAFEARRAY的描述,CComSafeArray
jameshooo 2008-05-08
  • 打赏
  • 举报
回复
Mackz的方法是终极解决方案。VB的数组跟VC中的SafeArray就是同一个东西,可以在两种语言中混合操作。
现在还是人类 2008-05-08
  • 打赏
  • 举报
回复
up
arong1234 2008-05-07
  • 打赏
  • 举报
回复
这种数组长度变化的技术是不可靠的,realloc分配到内存怎么办?还是不用这个,用其他的代替好了,例如CArray,vector
现在还是人类 2008-05-07
  • 打赏
  • 举报
回复
其实我要实现的是动态数组
就像我发贴时给出的VB程序目的一样,数组长度不是固定的
是在循环过程中进行识别对比后根据条件而扩张数组的范围。
w_anthony 2008-05-07
  • 打赏
  • 举报
回复
发现上面的(BBType)少写了一个*
w_anthony 2008-05-07
  • 打赏
  • 举报
回复
这样不会出问题么?new的地址用来relloc?虽然没试过,总感觉不太对……

D=new BBType[1]; //D = (BBType)malloc(sizeof(BBType));
D=(BBType)realloc(D, X);


不过LZ的DLL导出函数的第四个参数D肯定是不能用以上方法解决的,数据结构不一样。
至于能不能用14L的方法,本人水平有限,确实不知道。如果真如他所说,VB数组的数据结构和CComSafeArray的结构相同,那么这就是唯一的方法了。
除非你改变DLL导出函数的参数设定,个人建议你改变的第四个参数类型,作为一个DLL的导出函数而言,最好不要使用复杂的数据结构,这也是为兼容性作考虑。
cnzdgs 2008-05-07
  • 打赏
  • 举报
回复
这样当然会出问题,应该避免在两种不同的编程语言之间做这类操作,你可以修改函数参数定义,把输入与输出分别用两个参数。
菜牛 2008-05-07
  • 打赏
  • 举报
回复
要返回给VB的,最好用SAFEARRAY,可以用ATL的CComSafeArray类,其成员函数CComSafeArray::Resize和VB的ReDim一样用。
Eleven 2008-05-07
  • 打赏
  • 举报
回复
Up,建议用vector
w_anthony 2008-05-07
  • 打赏
  • 举报
回复
VB不会,不知道你的VB程序是怎么调用的……
如果是VC,并且遵循c标准,那么,要么就是传出一个指针和长度再由外部释放,要么就是外部分配好空间再传进去,如果是c++,可以考虑用vector,不过既然使用了复杂数据结构,基本上不能被其他语言的程序调用了。
一般来说,写DLL推荐使用C标准,虽然返回一个类似于com的带虚函数的对象指针也不错,不过VB基本上就没法用了,如果是C标准的话,我会这样定义:

bool BBTypeCreate(BBType**, UINT*,.../*其他参数*/); //取得一个BBType*和其长度
void BBTypeDestroy(BBType*); //删除之前取得的BBType*
现在还是人类 2008-05-07
  • 打赏
  • 举报
回复
up
现在还是人类 2008-05-07
  • 打赏
  • 举报
回复
哦,还有,因为我编的是供VB调用的API方式的DLL,所以没有用MFC
这样好象没有CArray来用吧,用New的方法不是不能用,就是不稳定。
经常在VB里调用时整个VB都会崩溃,有时候又正常。不过调用次数一
多就会崩溃。大家给个详细的代码好吗?就我上面的改改就成。拜托。
现在还是人类 2008-05-07
  • 打赏
  • 举报
回复
那我上面的程序该怎么改好呢?
现在还是人类 2008-05-07
  • 打赏
  • 举报
回复
能帮我写个例子吗?我不怎么懂
现在还是人类 2008-05-06
  • 打赏
  • 举报
回复
是这样的,我正在用VC做一个图形处理的函数供VB调用
因为函数比较复杂,所以必须返回一个结构数组给VB
比如是这样的
在VB里调用函数:
Private Type BBType
A As Long
B As Integer
End Type
Private Declare Function MyAPIFunction Lib "API.dll" _
(ByVal A As Long, ByVal B As Integer, ByVal C As Long, D As Any) As Long


Dim A as long,B as Long,C as Long
Dim D() As BBType
Redim D(0)
MyAPIFunction A,B,C,D(0)
Msgbox Ubound(D)


在VC里函数这样处理:

#include "malloc.h"
typedef struct _BBType
{
DWORD A;
WORD B;
} BBType;
DWORD UULen;

_stdcall MyAPIFunction(DWORD A,WORD B,DWORD C,BBType* D){
DWORD X;
UULen=1;
D=new BBType[1];
for(X=1,X<=C,X++){
if(X==1){
D[1].A=A;
D[1].B=B;
}else{
D=(BBType)realloc(D, X);
D[X].A=A;
D[X].B=B;
}
}
return C;
}

虽然这不是我的具体程序,但大概方法差不多,而我在用的时候经常出错,VB都崩溃去
请高手指点一下。
加载更多回复(8)

16,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧