freelark 发表于 2014-12-24 15:07

应用程序通过mathlink建立与内核mathkernel的连接

目前可实现
1、c++与mathkernel的连接,交互数据。
问题是:无法实现图形输出,更谈不上图形的动态交互。

附参考书:mathlink帮助




freelark 发表于 2014-12-24 15:17

这是我写的数据连接代码。
//---------------------------------------------------------------------------

#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:37

本帖最后由 freelark 于 2015-1-5 17:38 编辑

经过数天摸索,在c++ builder中实现了连接

页: [1]
查看完整版本: 应用程序通过mathlink建立与内核mathkernel的连接