应用程序通过mathlink建立与内核mathkernel的连接
目前可实现1、c++与mathkernel的连接,交互数据。
问题是:无法实现图形输出,更谈不上图形的动态交互。
附参考书:mathlink帮助
这是我写的数据连接代码。
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "Stdlib.h"
#include "Stdio.h"
#include "mathlink.h"
#include "String.h"
static int read_and_print_expression( MLINK lp);
static int read_and_print_atom( MLINK lp, int tag);
static int read_and_print_function( MLINK lp);
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "RzEdit"
#pragma resource "*.dfm"
TForm1 *Form1;
int sum;
double tmpbackreal;
MLEnvironment env;
MLINK lp;
int argc = 4;
char *argv = {"-linkname",
"D:\\Program Files\\Mathematica\\9.0\\mathkernel -mathlink",
"-linkmode",
"launch",
NULL};
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
const CHAR *pOutputString;
MLPutFunction(lp, "EvaluatePacket", 1);
MLPutFunction(lp, "ToExpression", 1);
MLPutString(lp, AnsiString(Edit1->Text).c_str());
MLEndPacket(lp);
while (MLNextPacket(lp) != RETURNPKT) MLNewPacket(lp);
read_and_print_expression(lp);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Edit1->Text = "Power";
env = MLInitialize(NULL); if(env == NULL) Edit2->Text = "出错env" ;
lp = MLOpen(argc, argv); if(lp == NULL) Edit2->Text = "出错lp" ;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
MLClose(lp);
MLDeinitialize(env);
}
//---------------------------------------------------------------------------
static int read_and_print_expression( MLINK lp)
{
int tag;
switch (tag = MLGetNext( lp)) {
case MLTKSYM:
case MLTKSTR:
case MLTKINT:
Form1->RzNumericEdit1->Text = tag;
Form1->Label1->Caption = Form1->RzNumericEdit1->Text;
return read_and_print_atom( lp, tag);
case MLTKREAL:
Form1->RzNumericEdit1->Text = tag;
Form1->Label1->Caption = Form1->RzNumericEdit1->Text;
return read_and_print_atom( lp, tag);
case MLTKFUNC:
return (read_and_print_function( lp));
case MLTKERROR:
//case MLTKGRAF;
default:
return 0;
}
}
static int read_and_print_function( MLINK lp)
{
int len, i;
static int indent;
if( ! MLGetArgCount( lp, &len)) return 0;
indent += 3;
printf( "\n%*.*s", indent, indent, "");
if( read_and_print_expression( lp) == 0) return 0;
printf( "[");
for( i = 1; i <= len; ++i) {
if( read_and_print_expression( lp) == 0) return 0;
if( i < len) printf( ", ");
}
printf( "]");
indent -= 3;
return 1;
}
static int read_and_print_atom( MLINK lp, int tag)
{
#if MLINTERFACE >= 3
const char *s;
#else
kcharp_ct s;
#endif /* MLINTERFACE >= 3 */
if( tag == MLTKSTR) putchar( '"');
if( MLGetString( lp, &s)){
//printf( "%s", s);
Form1->Memo1->Text = AnsiString(s).c_str();
MLDisownString( lp, s);
}
if( tag == MLTKSTR) putchar( '"');
putchar( ' ');
return MLError( lp) == MLEOK;
}
static void error( MLINK lp)
{
if (MLError( lp)) {
fprintf( stderr, "Error detected by MathLink: %s.\n",
MLErrorMessage( lp));
}else{
fprintf( stderr, "Error detected by this program.\n");
}
exit( 1);
}
本帖最后由 freelark 于 2015-1-5 17:38 编辑
经过数天摸索,在c++ builder中实现了连接
页:
[1]