String 如何计算用户在visual basic 6 exe中输入的任意数学函数?

String 如何计算用户在visual basic 6 exe中输入的任意数学函数?,string,math,vb6,String,Math,Vb6,我制作了一个程序,为给定的函数绘制一个斜率场 如果我在源代码中插入函数,它就可以正常工作 但我想把这个vb6项目变成一个exe文件 因为我之前就知道会发生这种情况,所以我之前做了一个字段来输入函数。该功能将以特殊形式输入。受AutoCAD中某些附加组件中使用的语言的启发,我制作了这种语言,并将其命名为DiffSol 所以用户要做的是使用DiffSol语言在字段中编写一个函数 问题是,它需要是vb中的一个真正的数学函数,才能针对不同的x和y进行计算。但我找不到一种策略,可以将该语言转换为可以计算

我制作了一个程序,为给定的函数绘制一个斜率场

如果我在源代码中插入函数,它就可以正常工作

但我想把这个vb6项目变成一个exe文件

因为我之前就知道会发生这种情况,所以我之前做了一个字段来输入函数。该功能将以特殊形式输入。受AutoCAD中某些附加组件中使用的语言的启发,我制作了这种语言,并将其命名为DiffSol

所以用户要做的是使用DiffSol语言在字段中编写一个函数

问题是,它需要是vb中的一个真正的数学函数,才能针对不同的x和y进行计算。但我找不到一种策略,可以将该语言转换为可以计算的vb数学函数

我要做的就是评估输入的函数15*31次

这项工作看起来像是在做一个编译器。这对我来说似乎是一件很难的工作


有什么想法吗?

简单的方法是将其转换为VBScript或JScript

创建一个包含用VB编写的函数的类:

' +(a,b)
public function ADD(a as double, b as double) as double
    add = a + b
end function

'/(a,b)
public function DIV(a as double, b as double) as double
    div = a / b
end function
添加对Microsoft脚本控件的引用,然后:

Dim scr As ScriptControl: Set scr = New ScriptControl
scr.Language = "VBScript"

'// allow the script access to the class with the functions
scr.AddObject "DS", new diffsolClass

expr = " +(200, c(/(+(2,6), 2))) "

'//parse with simple substitution
parsed = expr
parsed = Replace$(parsed, "/", "DS.DIV")
parsed = Replace$(parsed, "+", "DS.ADD")
parsed = Replace$(parsed, "c", "cos") '//built in already

'//for some valid VB: DS.ADD(200, cos(DS.DIV(DS.ADD(2,6), 2))) 

'//run it
MsgBox scr.Eval(parsed)

返回
199.346356379136

简单的方法是将其转换为VBScript或JScript

创建一个包含用VB编写的函数的类:

' +(a,b)
public function ADD(a as double, b as double) as double
    add = a + b
end function

'/(a,b)
public function DIV(a as double, b as double) as double
    div = a / b
end function
添加对Microsoft脚本控件的引用,然后:

Dim scr As ScriptControl: Set scr = New ScriptControl
scr.Language = "VBScript"

'// allow the script access to the class with the functions
scr.AddObject "DS", new diffsolClass

expr = " +(200, c(/(+(2,6), 2))) "

'//parse with simple substitution
parsed = expr
parsed = Replace$(parsed, "/", "DS.DIV")
parsed = Replace$(parsed, "+", "DS.ADD")
parsed = Replace$(parsed, "c", "cos") '//built in already

'//for some valid VB: DS.ADD(200, cos(DS.DIV(DS.ADD(2,6), 2))) 

'//run it
MsgBox scr.Eval(parsed)

返回
199.346356379136

所以你发明了自己的符号“DiffSolv”,现在想编译成机器码?怎么称呼?我假设你想把它编译成VB6代码。坚持“Diffsolv”函数只是VB6代码,让用户编写一个包含所需代码的单独VB6程序不是更容易吗?还是DiffSolv和VB6之间有一些固有的区别?@IraBaxter-emmm。语言一点也不重要!问题是我不能告诉VB
execute(Txt\u input.text)
。所以我必须自己把它翻译成vb(我想)。我能想到的最简单的方法是一种语言,在这种语言中,首先介绍函数的所有数学知识,然后介绍参数。这正是我想到的。嗯,你可以用VB6建立一个解释程序来计算你的公式。它不会像编译代码那样“快速”,但15*31=4500次真的没有那么多。。。。如果每次迭代耗时10毫秒,则会消耗4.5秒的时间,这在应用程序中可能还可以。对你来说,你可以学习如何编写解析器和公式计算器;这很容易。有关如何做到这一点,请参见此答案:VB6与Excel VBA几乎100%兼容。一个可能的想法是从Excel启动userform。可以让Excel的内置表达式解析器(使用标准中缀符号)对其进行解析,并让Excel的内置计算引擎对其进行繁重的计算。如果您不想走这条路,@IraBaxter的想法非常好,而且考虑到表达式的性质,它很容易实现。解析数学表达式只有在必须使用中缀符号处理优先级和关联性时才比较困难。@IraBaxter不是465次吗?所以你发明了自己的符号“DiffSolv”,现在想编译成机器代码?怎么称呼?我假设你想把它编译成VB6代码。坚持“Diffsolv”函数只是VB6代码,让用户编写一个包含所需代码的单独VB6程序不是更容易吗?还是DiffSolv和VB6之间有一些固有的区别?@IraBaxter-emmm。语言一点也不重要!问题是我不能告诉VB
execute(Txt\u input.text)
。所以我必须自己把它翻译成vb(我想)。我能想到的最简单的方法是一种语言,在这种语言中,首先介绍函数的所有数学知识,然后介绍参数。这正是我想到的。嗯,你可以用VB6建立一个解释程序来计算你的公式。它不会像编译代码那样“快速”,但15*31=4500次真的没有那么多。。。。如果每次迭代耗时10毫秒,则会消耗4.5秒的时间,这在应用程序中可能还可以。对你来说,你可以学习如何编写解析器和公式计算器;这很容易。有关如何做到这一点,请参见此答案:VB6与Excel VBA几乎100%兼容。一个可能的想法是从Excel启动userform。可以让Excel的内置表达式解析器(使用标准中缀符号)对其进行解析,并让Excel的内置计算引擎对其进行繁重的计算。如果您不想走这条路,@IraBaxter的想法非常好,而且考虑到表达式的性质,它很容易实现。解析数学表达式只有在必须使用中缀符号处理优先级和关联性时才比较困难。@IraBaxter不是465次了吗?谢谢。但是,我很难理解你用过的东西和别人谈论的东西。顺便问一下,你能提到一本在线提供的教这些东西的好电子书吗?所以我会去读那些我有问题的部分。我想那样会更好…谢谢。但是,我很难理解你用过的东西和别人谈论的东西。顺便问一下,你能提到一本在线提供的教这些东西的好电子书吗?所以我会去读那些我有问题的部分。我想那样会更好。。。