VB 主程序vb子程序或函数未定义问题

[转载]初学VB与Visual&Fortran混合编程
开发环境:Microsoft Visual Studio 2005—Visual Basic
Intel Visual Fortran Compiler
我采用的混合编程方式是用VB构造主程序,调用Intel Fortran例程生成的动态链接库(DLL)。
首先在Fortran中进行声明:
格式:!DEC$ ATTRIBUTES DLLEXPORT, ALIAS : "子程序名" :: 子程序名
同时在vb主程序中定义:
Private Declare Sub 子程序名 Lib "(路径)文件名.dll" (参数定义)
学习过程中我遇到的第一个问题就是,调用的dll文件应该放在哪里?
用Fortran生成的dll文件都在项目文件夹中的Debug文件夹中,当用vb调用的时候可以用绝对路径来定义,但是如果程序拷到别的电脑里或者文件位置改了,那程序就找不到dll了。在网上搜索了一遍,终于找到了答案。不能使用相对路径,但可以不要路径。Windows首先在EXE目录中寻找DLL,如果没有就在Windows目录、System目录、System32目录和路径中寻找DLL。所以只需要将DLL拷贝到这些目录之一就可以了。这样我把dll文件放在vb项目文件夹里(bindebug)就OK了。
之后又遇到一个问题——未处理AccessViolationException:
Fortran程序是这样的:
SUBROUTINE ARRAYTEST(n,arr)
implicit none
!dec$ ATTRIBUTES DLLEXPORT :: ARRAYTEST
REAL(4) n,arr
arr=arr*3.0
END SUBROUTINE
VB程序是这样的:
Public Class Form1
&&& Private
Declare Sub ARRAYTEST Lib "ex_vf.dll" (ByVal a As Single, ByVal b
As Single)
&&& Private
Declare Sub forstr Lib "ex_14.dll" (ByVal bstring As String)
&&& Private Sub
Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
Dim a As Single
Dim b As Single
Dim bstring As New String(CChar(""), 40)
Call ARRAYTEST(a, b)
Call forstr(bstring)
TextBox1.Text = bstring
TextBox2.Text = b
TextBox3.Text = a
问题出现在调用的程序那里,网上搜了一遍,发现可能是参数传递形式或类型的问题。两种语言对应的基本数据类型:
Visual Basic
INTEGER(2)
INTEGER(4)
程序数据类型定义并没有问题,问题出在哪儿了?后来让我发现了这句定义:
Private Declare Sub ARRAYTEST Lib "ex_vf.dll" (ByVal a As
Single, ByVal b As Single)
把ByVal改为ByRef后,程序就通过了。原来这么简单。
表示该参数是按值传递,ByRef表示该参数按地址传递。至于为什么这样改就对了,我还是不太明白。
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。在线时间116 小时威望0 金钱1067 人气0 最后登录注册时间帖子精华0积分1577阅读权限20UID39849
中级程序员, 积分 1577, 距离下一级还需 423 积分
擂点0 人气0 威望0 注册时间精华0帖子
如何实现将个数不确定的数据(但类型是一样的,都是单精度数据)传递给一个子程序???例如:有时可能有10个数据需通过某子程序运算、有时可能有100个数据需通过某子程序运算,请问如何才能将这种不确定个数的参数,传递到一个固定的子程序中???
在线时间112 小时威望0 金钱156 人气0 最后登录注册时间帖子精华0积分1182阅读权限20UID90203
中级程序员, 积分 1182, 距离下一级还需 818 积分
擂点0 人气0 威望0 注册时间精华0帖子
本帖最后由 fox7 于
16:30 编辑
是指传递给Sub或Function吗?如下例子:
'sText()为动态字符串数组
Public Sub PrintText(sText() As String)
& & For i = 1 To UBound(sText)
& && &&&Print sText(i)& && &&&
在线时间57 小时威望0 金钱188 人气0 最后登录注册时间帖子精华0积分646阅读权限20UID116507
中级程序员, 积分 646, 距离下一级还需 1354 积分
擂点0 人气0 威望0 注册时间精华0帖子
是这个样子吗?
Private Sub Form_Load()
Dim data1(9) As Single, i%
For i = 0 To 9
& & data1(i) = Rnd(Timer)
Call sh(data1)
Sub sh(data2() As Single)
& & MsgBox UBound(data2)
& & MsgBox data2(0)
在线时间495 小时威望258 金钱3691 人气51 最后登录注册时间帖子精华0积分6942阅读权限80UID111568
在职会计不专业 业余编程很业余
系统分析员, 积分 6942, 距离下一级还需 1058 积分
擂点0 人气51 威望258 注册时间精华0帖子
还是把不确定的单精度数据转换为一串字符串传递比较好
&会丢精度的,而且运行速度还慢,就是写代码方便了……&
在线时间325 小时威望111 金钱1722 人气25 最后登录注册时间帖子精华0积分4182阅读权限80UID92497
系统分析员, 积分 4182, 距离下一级还需 3818 积分
擂点1 人气25 威望111 注册时间精华0帖子
对于参数不定的函数,可以用ParamArray关键字!
但你这个问题,明显,用数组还是很合适,在你的函数或子程序中,不管是不是动态数组,都是一样的处理方法
在线时间2051 小时威望2686 金钱14722 人气468 最后登录注册时间帖子精华2积分32717阅读权限200UID89159
Code Glutton (噬码者)
擂点39 人气468 威望2686 注册时间精华2帖子
字符串传递影响速度和精度
ParamArray关键字只能在写代码阶段使用,灵活性不佳
&ParamArray还运行得慢,因为数据类型是Variant……&
天下算法,唯快不破...
在线时间2051 小时威望2686 金钱14722 人气468 最后登录注册时间帖子精华2积分32717阅读权限200UID89159
Code Glutton (噬码者)
擂点39 人气468 威望2686 注册时间精华2帖子
对,还是变体的数组
天下算法,唯快不破...
在线时间116 小时威望0 金钱1067 人气0 最后登录注册时间帖子精华0积分1577阅读权限20UID39849
中级程序员, 积分 1577, 距离下一级还需 423 积分
擂点0 人气0 威望0 注册时间精华0帖子
多谢各位正解VB编程语言-学术百科-知网空间
VB编程语言
VB编程语言
visual basic programming language编写系统程序或应用程序而设计的一系列人工语言。计算机程序语言是按一定规则构成的字符...按语言的不同编程环境,可分为文本编程语言和可视化编程语言。如FORTRAN、PASCAL等是支持文本编程的语言,而VB、VC、VFP等则是支持可视化编
与"VB编程语言"相关的文献前10条
VB是VisualBasic的简称,是通过对事件描述、对方法描述和对属性描述的方式来描述一个对象。VB编程语言系统主要拥有GUI系统(即图形用户界面)以及RAD系统(快速应用程序
VB编程语言是一门实践性很强的课程,本文针对学生学习过程中出现的困难,进行了客观的分析,找出了其中的原因。并且针对性地提出了解决方法,通过以目标为导向,实例为学习工具,有效地将V
作者在本文中详细介绍了 VB与 Visual Fortran(VB\VF)混合语言编程技术 ,尤其是对怎样用 VB语言调用 Fortran动态连接库 (DLL)进行了详细的说明。
电力系统通信设计中需要手动计算的数据很多,存在效率低、易出错等问题,本项目依据光通信技术,基于VB编程语言与Access数据库,开展了对电力光通信系统软件的开发,自动完成了光口选
《VB语言程序设计》作为高校的公共基础课,具有很强的理论性和实践性,开设这门课程的目的是让学生进行入门级编程教育,方便以后进行更深入地学习计算机编程和设计。本文根据VB课程的内容
随着计算机技术的发展,信息处理问题通常通过计算机系统来解决。鉴于高校课程体系的日趋丰富和完善,传统的方法已经不能满足需求,因而需要计算机来进行排课,方便教学。本文研究也正是基于此
Visual Basic程序设计语言是中职计算机专业的首选教学语言,但由于其理论性,实践性强,教学难度大,而且中职学生理解能力与独立思考能力较差,自我激励与克制能力偏弱,自信心不
以MASM32为例,用MASM32汇编语言编写主程序,用VB语言编写子程序,在MASM32汇编语言中调用高级语言程序,解决了WINDOWSXP环境下Win32汇编语言和高级语言的
利用Fortran语言强大的计算功能并结合Visual Basic语言良好的可视化界面设计功能,开发出能计算复杂工况且具有较好的人机交互界面的结构动力分析有限元计算程序系统(SD
可编程逻辑控制器(PLC)与上位机之间的通信是实现工业自动控制经常用到的通信模式,本文基于VB程序设计语言,以单点控制为例,实现了上位机与PLC之间的串行通信。
"VB编程语言"的相关词
快捷付款方式
订购知网充值卡
<font color="#0-819-9993
<font color="#0-
<font color="#0-推荐:&&&&
&当前位置:
& S7-200 PLC的子程序
S7-200 PLC的子程序
核心提示: 在结构化程序设计中,将实现某种控制功能的一组指令设计在一个模块中,该模块可以被多次调用执行,每次执行结束后,系统又返回到调用处继续执行原来的程序,这&&& 在结构化程序设计中,将实现某种控制功能的一组指令设计在一个模块中,该模块可以被多次调用执行,每次执行结束后,系统又返回到调用处继续执行原来的程序,这样的模块称为子程序。S7-200 PLC的指令系统可以方便、灵活地实现子程序建立、子程序调用和子程序返回操作。
&&& 1.建立子程序
&&& 用户可以通过S7-200 PLC的编程软件建立子程序,其操作步骤如下。
&&& 1)运行编程软件,在&编辑&菜单的&插入&选项中选择&子程序&,如图3 -51所示。
&&& 图3-51 新建子程序
&&& 2)在指令树窗口可以看到新建的子程序图标,默认的程序名是SBR_N,编号N从0开始按递增顺序生成。可以在图标上直接更改子程序的程序名,如图3-52所示。
图3-52 新建的子程序图标及默认的程序名
&&& 3)在指令树窗口中双击子程序的图标就可以进入子程序编辑窗口。图3-53为SBR_0子程序的编辑窗口。双击主程序图标MAIN可切换回主程序编辑窗口。
&&& 图3-53 子程序编辑窗口
&&&&4)若子程序需要接收(传人)调用程序传递的参数,或者需要输出(传出)参数给调用程序,则在子程序中可以设置参变量。子程序参变量应在子程序编辑窗口的子程序局部变量表中定义,如图3-53所示。
&&& 2.子程序调用指令
&&& (1)子程序调用指令CALL
&&& 在子程序建立后,可以通过子程序调用指令反复调用子程序。子程序的调用可以带参数,也可以不带参数。它在梯形图中以指令盒的形式编程。其指令格式如图3-54所示。
&&& 图3-54&CALL指令的指令格式
&&&&其中,EN为子程序调用使能控制输入信号,SBR_0为子程序名,CALL为STL指令调用子程序助记符。
&在子程序调用使能控制输入信号接通时,主程序转向子程序人口执行子程序。
&1)子程序名可以修改。为了便于阅读,一般定义为该子程序功能英文单词的缩写。
&2)该指令应用在主程序或调用程序中,可以实现嵌套调用。
&3)当子程序在一个周期内被多次调用时,不能使用上升沿、下降沿、定时器和计数器指令。
&&& 4)累加器可以在调用程序和被调用程序之间传递参数,所以累加器的值在子程序调用时不需要保护。
&&& (2)子程序条件返回指令CRET
&&& CRET指令在梯形图中以线圈形式编程,指令不带参数。其指令格式如图3-55所示。
图3-55&CRET指令的指令格式
&&& 在控制输入信号接通(即条件满足)时执行CRET指令,可以结束子程序的执行,返回主程序或调用程序继续执行原来的程序。
&&& 1) CRET指令应用在子程序内部。
&&& 2) CRET指令不能直接接在左母线上,必须在其左边设置条件控制输入信号。
&&& 3)子程序的自动返回(结束)STL指令形式为CRET。
&&& 4)在用Micro/Win V4.0编程时,不需要输入RET返回指令。该软件自动将RET指令加在每个子程序结尾。
&&& 3.子程序嵌套
&&& 如果在子程序的内部又对另一个子程序执行调用指令,这种调用称为子程序的嵌套。子程序最多可以嵌套8级:
&&& 当一个子程序被调用时,系统自动保存当前的堆栈数据,并把栈顶置&1&,堆栈中的其他位置为&0&,子程序占有控制权。子程序执行结束,通过返回指令自动恢复原来的逻辑堆栈值,调用程序又重新取得控制权。
&&& 注意在中断服务程序调用的子程序中不能再出现子程序嵌套调用。
&&& 【例3-14】&子程序调用指令示例程序如图3-56所示。
&&& 本例的要求如下。
&&& 建立子程序SBR_0.使Q1.0控制一个闪光灯(周期性亮2s,熄灭2s)。该子程序由主程序中I0.0直接控制调用,也可由子程序SBR_1嵌套调用。
&&& 建立子程序SBR_1,对I1.0计数脉冲计数。计数值为10时,嵌套调用子程序SBR_0,驱动Q1.0闪亮。该子程序由主程序I0.1控制调用。
&&& 本例用外部控制条件分别调用两个子程序,其工作过程如下。
&&& 1)主程序网络1中,当输入控制I0.0接通时调用子程序SBR_0。
&&& 2)主程序网络2中,当输入控制I0.1接通时调用子程序SBR_1,计数器C1开始对I1.0脉冲计数,当计数值为10时,触点C1导通,调用子程序SBR_0。
&&& 4.带参数的子程序调用
在子程序中可以根据需要设置参变量,该参变量接收调用程序传递的实际参数,并且只能在子程序内部使用。因此,子程序参变量又称局部变量。带参数的子程序调用扩大了子程序的使用范围,增加了调用的灵活性。
&&& 图3-56 子程序调用指令示例
&&& (1)带参数子程序调用的指令格式
&&& 带参数子程序调用的指令格式如图3-57所示。
&&& 图3-57&带参数子程序调用的指令格式
&其中,EN为子程序调用使能控制输入信号,SBR_1为子程序名,CALL为STL指令调用子程序助记符.IN1、IN2、IN3为子程序输入参数,IN1_OUT1为子程序输入/输出参数,OUT1为子程序输出参数。STL指令中的各参数按规定的顺序与LAD对应。
&&& 在子程序调用使能控制输入信号接通时,主程序转向子程序入口执行子程序,同时将IN参数传递给子程序。在子程序返回时,将OLTT参数返回给指定参数。
&&& (2)子程序参数定义
&&& 一个子程序最多可以传递16个参数,参数应在子程序编辑窗口的局部变量表中加以定义。子程序的参数必须确定其变量名、变量类型和数据类型。
&&& 1)变量名最多用23个字符表示,有效字符为前8个,第一个字符不能是数字。
&&& 2)变量类型是按变量对应数据的传递方向来划分的,可以是传人子程序(IN)、传人和传出子程序(IN_OUT)、传出子程序(OUT)和暂时子程序(TEMP)4种变量类型。
&&& 3)在子程序变量表中还要对数据类型进行声明。数据类型可以是能流(位输入操作)、布尔型、无符号数(字节型、字型、双字型)、有符号数(整数型、双整数)和实型。
&&& 在图3-58的子程序变量表中,各类型的参数在变量表中的位置是按以下先后顺序排列的。
&&& 1)最前面为能流,仅允许对位输入EN操作,是位逻辑运算的结果。在局部变量表中布尔能流输入处于所有类型的最前面。
&&& 2)其次为输入参数,用于传人子程序参数。由调用程序传人的参数可以是直接寻址数据(如VB10)、间接寻址数据(如*ACI)、立即数(如16 #2344)和数据存储单元的地址值(如&VB106)。
&&& 3)紧接着是输入输出参数,用于传人传出子程序参数,在调用子程序时将指定参数位置的值传到子程序,在子程序返回时把从子程序得到的结果值回传到同一地址。参数可以采用直接和间接寻址,但立即数(如16#1234)和地址值(如&VB100)不能作为参数。
&&& 4)然后是子程序返回(输出)参数,用于传出子程序参数。它将从子程序返回的结果值送到指定的参数位置。输出参数可以采用直接和间接寻址,但不能是立即数或地址编号。
&&& 5)最后是TEMP类型的暂时变量,用于在子程序内部暂时存储数据,不能用来与主程序传递参数数据。
&&& (3)参数子程序调用的规则
&&& 在使用带参数的子程序进行子程序调用指令时应遵循以下规则。
&&& 1)常数参数必须声明其数据类型;同一常数可以解释为不同的数据类型。为此,在使用常数作为子程序调用参数时,必须声明常数所属数据类型。例如,常数200000为无符号双字,在作为调用子程序的参数传递时,必须用DW#200000表示。
&&& 2)调用参数必须按照输入参数(IN)&输入输出参数(IN/OUT)&输出参数(OUT)这样的顺序排列。
&&& 3)一般来说,子程序变量表中的参数应与调用程序传递的参数类型一致,但在传递时如果不一致,则子程序参数类型为调用程序参数类型。例如,子程序变量表中声明一个参数为实型,而在调用时对应使用的参数为双字类型,则子程序中的这个参数就是双字类型。
&&& (4)变量表使用
&&& 在子程序编辑窗口的局部变量表中要加入一个参数,用鼠标右键单击要加入的变量类型区可以得到一个快捷菜单,选择&Insert&(插入),然后选择&Row Below&(下一行)即可。若要删除一个参数,可以用鼠标单击该行最左边地址栏,然后按( Delete)键即可。局部变量表的变量使用局部变量存储器,编程软件从起始地址L0.0开始自动给各参数分配局部变量存储空间。
&&& 【例3-15】&在S7-200 PLC的编程软件中已设计好子程序(略)和变量表,子程序名为SBR_0,其子程序变量表如图3-58中的表格所示。子程序调用指令如图3-59所示。
图3-58 子程序变量表
图3-59 带参数子程序调用示例
&本例中各类型参数的含义如下。
&子程序名为SBR_0;子程序输入局部变量参数IN1、IN2、IN3分别对应调用程序传递的实际参数I0.1、&VB100、L1.2;子程序输入/输出参数为VW50;子程序输出参数为VD200。
&&& 本例的工作过程如下。
&&& 1)调用程序中I0.0接通时,EN有效,程序转移至子程序SBR_0执行。同时将调用程序的参数I0.1的状态、存储器VB100单元的地址、局部存储器位数据L1.2及存储器VW50单元的字数据按顺序分别传递给子程序中的变量IN1、IN2、IN3及IN_OUT1。
&2)执行子程序。
&3)子程序SBR_0返回时,将子程序中的局部变量IN_OUT1及OUT1的值分别传给调用程序的VW50和VD200,然后继续执行原来的调用程序。
免责声明:本文章仅代表作者个人观点,与艾特贸易网无关。因本站大部分技术资料均为原创文章,为避免其他网站的抄袭及复制,本站注册会员才能浏览信息内容,不便之处,敬请谅解!文章仅作为读者参考使用,请自行核实相关内容,如若转载请注明来源:
注册会员无法查看信息内容注意事项:注册会员如果还是无法查看文章信息的内容,必须阅读过后台的未读站内信,才可正常查看文章内容!
分享与收藏:&
本文关键字:
为您推荐更多相关文章
网站客服:&&VB编程中,我分别编写了主程序和子程序,并各自独立编译成可执行文件_百度知道
VB编程中,我分别编写了主程序和子程序,并各自独立编译成可执行文件
但两个程序之间,存在大量的数据交换,我都是用以下方式完成程序之间数据沟通与传递的:主程序向子程序传递数据:SaveSetting &通信小程序&, &自定义通讯&, &子程序X坐标点&SaveSetting &通信小程序&, &自定义通讯&, &子程序Y坐标点&子程序接收来自主程序的数据:GetSetting(&通信小程序&, &自定义通讯&, &子程序X坐标点&)GetSetting(&通信小程序&, &自定义通讯&, &子程序Y坐标点&)请问:如果退出时,我不用:DeleteSetting &通信小程序&, &自定义通讯&, &子程序X坐标点&、DeleteSetting &通信小程序&, &自定义通讯&, &子程序Y坐标点&,删除这些数据,可不可以??如果退出程序时,大量类似数据都没删除,会造成什么后果??
提问者采纳
退出时是否需要清理现场,需要根据你程序而定,如果对下次执行没有影响,可以不做。不能确定时最好清理。对于程序间进行数据交换,如果不是很复杂,也可以采用程序间发送消息的办法,优点是可以实时反映到对方。方法是,在两个程序中设置hook,检测对方发送的消息。附件中给了个简单例子,因为使用了通过程序标题获得句柄,所以不能多开。
提问者评价
其他类似问题
为您推荐:
vb编程的相关知识
其他1条回答
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁}

我要回帖

更多关于 vb子程序或函数未定义 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信