📄 csharpexample.cs
字号:
m_parser.defineVar(m_z as IMTVariable);
// Define a shared double variable for test purpose
MTDouble v = new MTDouble();
v.create("v", 1.0);
m_parser.defineVar(v as IMTVariable);
double r = 0;
r = m_parser.evaluate("v");
// Change the variable's value
v.value = 10.0;
r = m_parser.evaluate("v");
Console.Out.WriteLine( "r = {0}", r ) ;
// Create another parser and copy the existing parser configuration
MTParser p2 = new MTParser();
p2.copy(m_parser);
r = p2.evaluate("v");
// the shared variable has been copied
// Changing the shared variable's value updates all parsers using this variable
v.value = 3.0;
r = p2.evaluate("v");
r = m_parser.evaluate("v");
// define a constant
m_parser.defineConst("pi", 3.14159);
// define a user-defined function
m_parser.defineFunc(new MySumFunction());
// Load localized information
string dir = System.AppDomain.CurrentDomain.BaseDirectory;
MTParserLocalizer localizer = new MTParserLocalizer();
localizer.locale = "en";
localizer.registerAllLibraries( dir, "*.xml");
sMTSyntax syntax = m_parser.getSyntax();
syntax.decimalPoint = '.';
syntax.argumentSeparator = ',';
m_parser.setSyntax(ref syntax);
// Load plug-ins
m_parser.loadAllPlugins( dir, "*.xml");
}
catch ( Exception )
{
MessageBox.Show("Error: " + getLastExcepText(m_parser), "Project1");
}
}
string getLastExcepText(MTParser parser)
{
string msg = "";
MTExcepData e = new MTExcepData();
MTParserLocalizer loc = new MTParserLocalizer();
do
{
parser.getLastExcep(e);
if (e.getID() != "ok")
{
string desc = "";
try
{
desc = loc.getExcep(e);
}
catch( Exception )
{
// No localized description available, so take the default text
desc = e.getDescription();
}
msg = msg + desc;
msg = msg + Environment.NewLine ;
}
} while(e.getID() != "ok");
return msg;
}
void Benchmark_Click(Object _sender, EventArgs _e1)
{
try
{
// For optimum performance evaluate in a batch...
// Redefine vector variables to contain multiple values
MTParser benchParser = new MTParser();
benchParser.copy( m_parser );
MTDoubleVector x = new MTDoubleVector();
MTDoubleVector y = new MTDoubleVector();
MTDoubleVector z = new MTDoubleVector();
x.create("x");
y.create("y");
z.create("z");
benchParser.undefineAllVars();
benchParser.defineVar(x as IMTVariable);
benchParser.defineVar(y as IMTVariable);
benchParser.defineVar(z as IMTVariable);
// Compile the expression only once
benchParser.compile(Expr.Text);
// Generate random variable values...
int nbEvals = 400000;
double[] xval = new double[nbEvals];
double[] yval = new double[nbEvals];
double[] zval = new double[nbEvals];
System.Random r = new System.Random(100);
for(int i = 0; i < nbEvals; i += 1)
{
xval[i] = r.Next(0, 1000);
yval[i] = r.Next(0, 1000);
zval[i] = r.Next(0, 1000);
}
// Set values...
x.setValueVector(xval);
y.setValueVector(yval);
z.setValueVector(zval);
double[] results = new double[nbEvals]; // this will contain all the results after evaluations
long beginTime = 0;
long endTime = 0;
beginTime = GetTickCount(); // start the timer
benchParser.evaluateCompiledBatch(nbEvals, results); // do all evaluations in one call, avoiding multiple COM calls
endTime = GetTickCount(); // stop the timer
long elapsedTime = 0;
elapsedTime = endTime - beginTime;
long nbEvalSec = 0;
double timePerEval = 0;
timePerEval = elapsedTime / (double)nbEvals;
nbEvalSec = (long)(nbEvals / elapsedTime * 1000.0);
Msg.Text = "Nb. Evaluations: " + nbEvals;
Msg.Text = Msg.Text + Environment.NewLine ;
Msg.Text = Msg.Text + "Elapsed time (ms): " + elapsedTime;
Msg.Text = Msg.Text + Environment.NewLine ;
Msg.Text = Msg.Text + "Time per evaluation (ms): " + timePerEval;
Msg.Text = Msg.Text + Environment.NewLine ;
Msg.Text = Msg.Text + "Nb. Eval per sec: " + nbEvalSec;
}
catch ( Exception e)
{
Msg.Text = "Error: " + e.Message;
}
}
void Evaluate_Click(Object _sender, EventArgs _e1)
{
try
{
// Update the variable' values
m_x.setValue(Convert.ToDouble(VarX.Text));
m_y.setValue(Convert.ToDouble(VarY.Text));
m_z.setValue(Convert.ToDouble(VarZ.Text));
// Evaluate the expression with the current variable' values
Result.Text = Convert.ToString(m_parser.evaluate(Expr.Text));
// Print the used variables
int nbUsedVars = 0;
nbUsedVars = m_parser.getNbUsedVars();
Msg.Text = "Used variables: ";
string symbol;
for(int t = 0; t <= nbUsedVars - 1; t += 1)
{
symbol = m_parser.getUsedVar(t);
Msg.Text = Msg.Text + symbol;
if (t != nbUsedVars - 1)
{
Msg.Text = Msg.Text + ", ";
}
}
}
catch ( Exception )
{
Msg.Text = "Syntax error: " + getLastExcepText(m_parser);
}
}
void Index_Click(Object _sender, EventArgs _e1)
{
IndexDlg frm = new IndexDlg();
frm.SetParser( m_parser );
frm.ShowDialog( this ) ;
}
void DefineMacro_Click(Object _sender, EventArgs _e1)
{
_macroDefinition.ShowDialog( this ) ;
}
}
/// <summary>
/// Example of a user-defined function. Implement only
/// the evaluateX method specified by the getNbArgs method.
/// </summary>
public class MySumFunction : IMTFunction
{
public double evaluate0()
{
throw new Exception("The method or operation is not implemented.");
}
public double evaluate1(double arg)
{
return arg;
}
public double evaluate2(double arg, double arg2)
{
return arg + arg2;
}
public double evaluate3(double arg, double arg2, double arg3)
{
return arg + arg2 + arg3;
}
public double evaluate(Array pArgs)
{
double sum = 0;
for (int t = 0; t < pArgs.Length; t++)
{
sum += (double)pArgs.GetValue(t);
}
return sum;
}
public string getDescription()
{
return "Computes the sum of many values";
}
public string getHelpString()
{
return "slowsum(x,y,z,...)";
}
public int getNbArgs()
{
return -1;
}
public string getSymbol()
{
return "slowsum";
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -