声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 4733|回复: 16

[混合编程] [求助]尝试vb调用matlab生成的com组件问题

[复制链接]
发表于 2006-6-13 10:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
简单的调用问题<BR>startright.m文件如下:<BR><BR>function y=startright(x)<BR>y=x^2<BR><BR>vb调用如下:<BR>Private Sub Command1_Click()<BR>Dim iop As startclass<BR>Set iop = New startclass<BR>Dim x As Variant<BR>Dim y As Variant<BR>x = 4<BR>Call iop.startright(1, y, x)<BR>print y<BR>End Sub<BR><BR>运行时错误提示Function 'mpower'not defined for variables of class 'int16'<BR>是参数传递的问题吗?不知道怎么改正<BR>请高手指点
回复
分享到:

使用道具 举报

 楼主| 发表于 2006-6-13 15:54 | 显示全部楼层
<P>弄了一天了还是没搞定<BR></P>[em06]<BR>看了前面的帖子没有讲这个错误的
发表于 2006-6-13 16:01 | 显示全部楼层

回复:(redelf)[求助]尝试vb调用matlab生成的com组件...

应该数数据类型的问题,matlab运算采用的是双精度类型的
 楼主| 发表于 2006-6-13 16:12 | 显示全部楼层
<P>但是com组件使用的输入输出参数不都是variant的吗<BR>我用的是varinat型变量,有错吗<BR></P>
发表于 2006-6-13 16:33 | 显示全部楼层

回复:(redelf)但是com组件使用的输入输出参数不都是...

<DIV class=quote><B>以下是引用<I>redelf</I>在2006-6-13 16:12:33的发言:</B><BR>
<P>但是<FONT color=#ff0000>com组件使用的输入输出参数不都是variant的吗</FONT><BR>我用的是varinat型变量,有错吗<BR></P></DIV>
<P>这是谁说的?你改成double看看</P>
 楼主| 发表于 2006-6-13 16:50 | 显示全部楼层
改为<BR>Private Sub Command1_Click()<BR>Dim iop As startclass<BR>Set iop = New startclass<BR>Dim x As Double<BR>Dim y As Variant<BR>x = 4<BR>Call iop.startright(1, y, x)<BR>print y<BR>End Sub<BR>后可以了,结果正确为16<BR>奇怪了,我找到的这篇文章“matlab的combuilder系列-matlab下做com组件”中有这么一句<BR>“可见matlab下函数的输入输出参数在com组件里全是variant型的变量,测试大获成功,结果就跟matlab下运行的一摸一样,爽”<BR>
 楼主| 发表于 2006-6-13 17:23 | 显示全部楼层
再问高手一个问题<BR>m文件如下<BR>function y=qiujielingdian(a,b,c,d,e,f,num)<BR>x=sym('x')<BR>z=sqrt(1/a/b)/tan(e*sqrt(x/a/b))+sqrt(1/c/d)/tan(f*sqrt(x/c/d))<BR>g=inline(z)<BR>y=fzero(g,num)<BR>在vb里面调用时<BR>Private Sub Command1_Click()<BR>Dim iop As pkclass<BR>Set iop = New pkclass<BR>Dim y As Variant<BR>Dim a As Double, b As Double, c As Double, d As Double, e As Double, f As Double, num As Double<BR> a = 2100000<BR> b = 12.57<BR> c = 2100000<BR> d = 86.44<BR> e = 2254.5<BR> f = 2320.5<BR>num = 1246.9<BR>Call iop.qiujielingdian(1, y, a, b, c, d, e, f, num)<BR>Print y<BR>End Sub<BR>出现错误“undefined function or variable 'sym'”<BR>这是因为什么
 楼主| 发表于 2006-6-13 20:48 | 显示全部楼层
这样调用有问题吗
发表于 2006-6-13 22:13 | 显示全部楼层
以下回答供参考:<BR>1.x是在MATLAB内部执行的变量,当然用double,y是返回值,且即将同vb作通信,当然要按规定定义为variant。<BR><a href="http://okok.org/cgi-bin/ut/topic_show.cgi?id=123366&amp;h=1&amp;bpg=1&amp;age=0" target="_blank" >http://okok.org/cgi-bin/ut/topic_show.cgi?id=123366&amp;h=1&amp;bpg=1&amp;age=0</A><BR>2.sym是符号函数,vb不支持此数据类型,不能调用并作数据通信。
 楼主| 发表于 2006-6-13 23:57 | 显示全部楼层
我的m文件函数是为了实现解带有参数的非线性方程<BR>如果sym用不了的话,只有寻找其他方法<BR>我写成两个函数<BR>%curefun.m<BR>function curefun=f(x,a,b,c,d,e,f)<BR>curefun=sqrt(x/a/b)/tan(e*sqrt(x/a/b))+sqrt(x/c/d)/tan(f*sqrt(x/c/d))<BR><BR>%notcurefun.m<BR>function notcurefun=f(a,b,c,d,e,f,num)<BR>notcurefun=fzero(@curefun,num,[],a,b,c,d,e,f)<BR>在matlab中调用notcurefun是可以的,但是生成了dll之后在vb中使用会出错<BR>end<BR>
 楼主| 发表于 2006-6-14 11:59 | 显示全部楼层
<P>期待高手指点</P>
 楼主| 发表于 2006-6-14 15:39 | 显示全部楼层
终于成功了[em01]<BR>把我的方法共享出来,还要感谢上面的朋友的帮忙<BR>使用两个函数curefun.m和notcurefun.m(见上页)<BR>用com builder生成com组件后在vb里面调用<BR>需要注意的是输入的参数要定义为double<BR>//bow
发表于 2006-11-2 19:51 | 显示全部楼层
我用其combuilder建立了一个.dll文件,然后在vb中 引用这个文件,结果老是出现错误,我基本是按照它的例子程序(magicdemo)来操作的,出现的错误是。
Automation error
The specified procedure could not be found ~~请高手指点那个地方有问题!
发表于 2006-11-3 15:43 | 显示全部楼层
大家好!
我做matlab中help的例子好用了!
参照两篇论文:《基于COM的VB与Matlab混合编程》 岳玉芳
                              《基于COM组件的VB与MATLAB接口编程》 黄锡泉
讲的比较详细!!
发表于 2006-11-3 21:12 | 显示全部楼层

请高人指点

我在找着matlab help中的例子作接口时,当生成com组件时,系统提示出现问题:
java exception occurred:
java.lang.arrayindexoutof boundsexception: 1>=1
at java.util.vector.elementat(unknown source)
at javax.swing.jlist$5.getelementat(unknown source)

我是新手,所以请各位指点一下!
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-17 18:22 , Processed in 0.070856 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表