| 查看: 1033 | 回复: 1 | ||
[求助]
delphi如何通过 mathlink,或者api函数调用mathematica的mathkernel 已有1人参与
|
|
delphi如何通过 mathlink,或者api函数调用mathematica的mathkernel 日本人做了一个activX插件,可用,但不好用。想自己做一个,但没找到方法。 网上有国人用vb做了,但找不到源码,无法入手。 目的,通过delphi传递计算公式到mathkernel,然后从math计算的结果传回delphi。 尝试了通讯tcp协议,没成功。 谢谢哟!!!!! |
» 猜你喜欢
拟解决的关键科学问题还要不要写
已经有7人回复
存款400万可以在学校里躺平吗
已经有19人回复
国自然申请面上模板最新2026版出了吗?
已经有19人回复
请教限项目规定
已经有3人回复
基金委咋了?2026年的指南还没有出来?
已经有10人回复
基金申报
已经有6人回复
推荐一本书
已经有13人回复
纳米粒子粒径的测量
已经有8人回复
疑惑?
已经有5人回复
计算机、0854电子信息(085401-058412)调剂
已经有5人回复

【答案】应助回帖
|
delphi没试出来。cb试出来的,不过不完美,下面是代码 CMathLink::CMathLink(String strEnginePath) { m_strEnginePath = strEnginePath; m_bConnected = FALSE; m_mlenvp = (MLENV)0; m_mlinkp = (MLINK)0; m_hemfGlobal = NULL; m_eInputMode = ExpressionExpected; m_bFirstPiece = TRUE; m_bVerboseMenuComing = FALSE; m_iDialogLevel = 0; m_strMsgInfo = ""; m_strGraphic = ""; m_strOutput = ""; m_strInput = ""; m_strOutputPrompt = ""; m_strInputPrompt = ""; m_strInitString = ""; m_strInitString = m_strInitString + "$Display := OpenTemporary[];" + "$DisplayFunction = (Module[{tmpstream = $Display, tmpfile}, " + "tmpfile = tmpstream[[1]]; Close[tmpstream]; " + "Display[tmpfile, #1, \"Metafile\"]; LinkWrite[$ParentLink, " + "DisplayEndPacket[tmpfile]]]; #1)&; SetOptions[{ContourGraphics, " + "ContourPlot, DensityGraphics, DensityPlot, Graphics, Graphics3D, " + "GraphicsArray, ListContourPlot, ListDensityPlot, ListPlot, " + "ListPlot3D, ParametricPlot, ParametricPlot3D, Plot, Plot3D, " + "SurfaceGraphics}, AspectRatio -> 2]; SetOptions[ \"stdout\", " + "PageWidth->65]; Format[LineBreak[_]]:= \"\";\n " + "Format[Continuation[_]]:= \"\"; SetAttributes[MessagePacket, " + "HoldFirst];"; } CMathLink::~CMathLink() { Disconnect(); } BOOL CMathLink::Connect() { BOOL bRet = FALSE; if(FALSE == m_bConnected) { INT lErr; m_mlenvp = MLInitialize( (MLParametersPointer)0); if(m_mlenvp != (MLENV)0) { /* int argc = 4; char *argv[5] = {"-linkname", "D:\\Program Files\\Mathematica\\9.0\\mathkernel -mathlink", "-linkmode", "launch", NULL}; m_mlinkp = MLOpen(argc,argv); */ String strLaunch; strLaunch = " -linkname '\""; strLaunch += m_strEnginePath; strLaunch += "\"-mathlink' -linkmode Launch"; m_mlinkp = MLOpenString(m_mlenvp,AnsiString(strLaunch).c_str(), &lErr); if(m_mlinkp != (MLINK)0) { m_bConnected = TRUE; fnEvaluate(m_mlinkp, ""); MLPutFunction(m_mlinkp, "EvaluatePacket", 1); MLPutFunction(m_mlinkp, "ToExpression", 1); MLPutByteString(m_mlinkp, AnsiString(m_strInitString).c_str(), m_strInitString.Length()); // MLPutString(m_mlinkp, AnsiString(Form1->Edit1->Text).c_str()); fnEvaluate(m_mlinkp, NULL); bRet = TRUE; } else { MLDeinitialize(m_mlenvp); m_mlenvp = (MLENV)0; } } } else bRet = TRUE; return bRet; } BOOL CMathLink::Connect2() { int argc = 4; char *argv[5] = {"-linkname", "D:\\Program Files\\Mathematica\\9.0\\mathkernel -mathlink", "-linkmode", "launch", NULL}; m_mlenvp = MLInitialize(NULL); if(m_mlenvp == NULL) Form1->Edit2->Text = "出错env" ; m_mlinkp = MLOpen(argc, argv); if(m_mlinkp == NULL) Form1->Edit2->Text = "出错lp" ; return TRUE; } void CMathLink::Disconnect() { if(NULL != m_hemfGlobal) DeleteEnhMetaFile(m_hemfGlobal); if(TRUE == m_bConnected) { MLPutFunction(m_mlinkp, "Quit", 0); MLClose(m_mlinkp); MLDeinitialize(m_mlenvp); m_mlenvp = (MLENV)0; m_mlinkp = (MLINK)0; m_bConnected = FALSE; } } INT CMathLink::fnCheckError(MLINK mlinkp) { INT iResult; if(mlinkp == (MLINK)0) return MLEDEAD; iResult = MLError(mlinkp); if(iResult) { m_strMsgInfo = MLErrorMessage(mlinkp); MLClose(mlinkp); } return iResult; } BOOL CMathLink::Evaluate(String pInputString) { if(TRUE == m_bConnected) { if(pInputString.Length() > MAXLENGTH_INPUT) return FALSE; if(pInputString != "") { char buffer[MAXLENGTH_INPUT]; memset(buffer, 0, MAXLENGTH_INPUT*sizeof(char)); strcpy(buffer, AnsiString(pInputString).c_str()); fnEvaluate(m_mlinkp, buffer); } return TRUE; } return FALSE; } void CMathLink::DisplayGraphic(HDC hdcGraphic, RECT& rect) { if(m_hemfGlobal) { RECT rc; INT cxborder, cyborder; FillRect(hdcGraphic, &rect, (HBRUSH) (COLOR_WINDOW + 1)); cxborder = GetSystemMetrics(SM_CXEDGE); cyborder = GetSystemMetrics(SM_CYEDGE); rc.left = rect.left + 4 + cxborder; rc.right = rect.right - 4 - cxborder; rc.top = rect.top + 4 + cyborder; rc.bottom = rect.bottom - 4 - cyborder; PlayEnhMetaFile(hdcGraphic, m_hemfGlobal, &rect); } } void CMathLink::Interrupt() { MLPutMessage(m_mlinkp, MLInterruptMessage); } void CMathLink::Abort() { MLPutMessage(m_mlinkp, MLAbortMessage); } char * CMathLink::fnReplaceSlashZeroOneTwo(char *pString) { char str[] = "\\012"; char ht[] = {10, 9, 0}; char *pInstance = pString; pInstance = strstr(pInstance, str); while(pInstance) { pInstance[0] = ' '; pInstance[1] = ' '; pInstance[2] = 13; pInstance[3] = 10; pInstance = strstr(pInstance, str); } pInstance = pString; pInstance = strstr(pInstance, ht); while(pInstance) { pInstance[0] = 13; pInstance[1] = 10; pInstance = strstr(pInstance, ht); } return pString; } BOOL CMathLink::fnEvaluate(MLINK mlinkp, CHAR *pInputString) { const CHAR *pOutputString,*temp; BOOL bDone = FALSE; INT iSyntaxErrorPosition = -1; INT iInterruptMenu; INT pak; if(NULL != pInputString) { if(m_eInputMode == ExpressionExpected) { // MLPutFunction(mlinkp, "EvaluatePacket", 1); // MLPutFunction(mlinkp, "ToExpression", 1); MLPutFunction(mlinkp, "EnterTextPacket", 1); } else { MLPutFunction(mlinkp, "TextPacket", 1); m_eInputMode = ExpressionExpected; } MLPutByteString(mlinkp, (const unsigned char*)pInputString, strlen(pInputString)); MLEndPacket(mlinkp); // Check linkp if(fnCheckError(mlinkp)) return FALSE; } m_strOutput = ""; while(!bDone) { while(1) { MLFlush(mlinkp); if(MLReady(mlinkp)) break; } switch(pak = MLNextPacket(mlinkp)) { case ILLEGALPKT: if(!MLClearError(mlinkp) || !MLNewPacket(mlinkp)) bDone = TRUE; break; case INPUTNAMEPKT: case INPUTPKT: if(MLGetString(mlinkp, &pOutputString)) { m_strInputPrompt = pOutputString; MLDisownString(mlinkp, pOutputString); } bDone = TRUE; break; case TEXTPKT: Form1->RzExpandEdit1->Text = Form1->RzExpandEdit1->Text +" TEXTPKT"+String(pak); if(MLGetString(mlinkp, &pOutputString)) { pOutputString = fnReplaceSlashZeroOneTwo((CHAR*)pOutputString); m_strOutput += pOutputString; m_strOutput += "\n"; MLDisownString(mlinkp, pOutputString); } if(m_bVerboseMenuComing) { m_bVerboseMenuComing = FALSE; m_strOutput += pInputString; bDone = TRUE; } break; case OUTPUTNAMEPKT: Form1->RzExpandEdit1->Text = Form1->RzExpandEdit1->Text +" OUTPUTNAMEPKT"+String(pak); if(MLGetString(mlinkp, &pOutputString)) { m_strOutputPrompt = pOutputString; MLDisownString(mlinkp, pOutputString); } break; case RETURNTEXTPKT: Form1->RzExpandEdit1->Text = Form1->RzExpandEdit1->Text +" RETURNTEXTPKT"+String(pak); if(MLGetString(mlinkp, &pOutputString)) { pOutputString = fnReplaceSlashZeroOneTwo((CHAR*)pOutputString); m_strOutput += pOutputString; m_strOutput += "\n"; MLDisownString(mlinkp, pOutputString); } break; case RETURNPKT: //MLNewPacket(mlinkp); // MLGetString(mlinkp, &temp); Form1->RzExpandEdit1->Text = Form1->RzExpandEdit1->Text +" RETURNTPKT"+String(pak); read_and_print_expression(mlinkp); break; case DISPLAYPKT: Form1->RzExpandEdit1->Text = Form1->RzExpandEdit1->Text +" DISPLAYPKT"+String(pak); if(TRUE == m_bFirstPiece) { m_strGraphic = ""; m_bFirstPiece = FALSE; } if(MLGetString(mlinkp, &pOutputString)) { m_strGraphic += pOutputString; //fnOpenWMFFile(AnsiString(m_strGraphic).c_str()); MLDisownString(mlinkp, pOutputString); } break; case DISPLAYENDPKT: Form1->RzExpandEdit1->Text = Form1->RzExpandEdit1->Text +" DISPLAYENDPKT"+String(pak); if(MLGetString(mlinkp, &pOutputString)) { fnOpenWMFFile(pOutputString); MLDisownString(mlinkp, pOutputString); } m_bFirstPiece = TRUE; break; case SYNTAXPKT: Form1->RzExpandEdit1->Text = Form1->RzExpandEdit1->Text +" SYNTAXPKT"+String(pak); MLGetInteger(mlinkp, &iSyntaxErrorPosition); m_strOutput += pInputString; m_strOutput += pInputString; memset(pInputString, ' ', iSyntaxErrorPosition); m_strOutput += pInputString; break; case INPUTSTRPKT: Form1->RzExpandEdit1->Text = Form1->RzExpandEdit1->Text +" INPUTSTRPKT"+String(pak); if(MLGetString(mlinkp, &pOutputString)) { m_strInputPrompt = pOutputString; MLDisownString(mlinkp, pOutputString); } m_eInputMode = StringExpected; bDone = TRUE; break; case MENUPKT: MLGetInteger(mlinkp, &iInterruptMenu); if(MLGetString(mlinkp, &pOutputString)) { strcpy(pInputString, pOutputString); MLDisownString(mlinkp, pOutputString); } m_eInputMode = StringExpected; if(iInterruptMenu == 0) m_bVerboseMenuComing = TRUE; else { m_strInputPrompt = pInputString; bDone = TRUE; } break; case MESSAGEPKT: Form1->RzExpandEdit1->Text = Form1->RzExpandEdit1->Text +" MESSAGEPKT"+String(pak); MLGetSymbol(mlinkp, &pOutputString); m_strMsgInfo += pOutputString; MLDisownString(mlinkp, pOutputString); MLGetString(mlinkp, &pOutputString); m_strMsgInfo += "::"; m_strMsgInfo += pOutputString; m_strMsgInfo += "\n"; MLDisownString(mlinkp, pOutputString); break; case SUSPENDPKT: m_strOutput += "***SUSPENDED***"; m_strOutput += "\n"; MLNewPacket(mlinkp); bDone = TRUE; break; case RESUMEPKT: m_strOutput += "***RESUMED***"; m_strOutput += "\n"; MLNewPacket(mlinkp); break; case BEGINDLGPKT: { CHAR buffer[32]; MLGetInteger(mlinkp, &m_iDialogLevel); m_strOutput += "Entering Dialog: "; m_strOutput += itoa(m_iDialogLevel, buffer, 10); m_strOutput += "\n"; } break; case ENDDLGPKT: { char buffer[32]; MLGetInteger(mlinkp, &m_iDialogLevel); m_iDialogLevel--; m_strOutput += "Leaving Dialog: "; m_strOutput += itoa(m_iDialogLevel, buffer, 10); m_strOutput += "\n"; } break; } // MLNewPacket(mlinkp); if(fnCheckError(mlinkp)) return FALSE; } return TRUE; } BOOL CMathLink::expEvaluate(CHAR *pInputString) { const CHAR *pOutputString; BOOL bDone = FALSE; INT iSyntaxErrorPosition = -1; INT iInterruptMenu; INT pak,pkt; // const CHAR *pOutputString; AnsiString(Form1->Edit1->Text).c_str() MLPutFunction(m_mlinkp, "EvaluatePacket", 1); MLPutFunction(m_mlinkp, "ToExpression", 1); MLPutString(m_mlinkp,pInputString); MLEndPacket(m_mlinkp); /* while ( (pkt = MLNextPacket(m_mlinkp), pkt) && pkt != RETURNPKT) { MLNewPacket(m_mlinkp); if (MLError(m_mlinkp)) fnCheckError(m_mlinkp); }; MLNewPacket(m_mlinkp); read_and_print_expression(m_mlinkp); */ while(!bDone) { /* while(1) { MLFlush(m_mlinkp); if(MLReady(m_mlinkp)) break; } */ switch(pak = MLNextPacket(m_mlinkp)) { case ILLEGALPKT: if(!MLClearError(m_mlinkp) || !MLNewPacket(m_mlinkp)) bDone = TRUE; break; case INPUTNAMEPKT: case INPUTPKT: if(MLGetString(m_mlinkp, &pOutputString)) { m_strInputPrompt = pOutputString; MLDisownString(m_mlinkp, pOutputString); } bDone = TRUE; break; case TEXTPKT: Form1->RzExpandEdit1->Text = Form1->RzExpandEdit1->Text +" TEXTPKT"+String(pak); if(MLGetString(m_mlinkp, &pOutputString)) { pOutputString = fnReplaceSlashZeroOneTwo((CHAR*)pOutputString); m_strOutput += pOutputString; m_strOutput += "\n"; MLDisownString(m_mlinkp, pOutputString); } if(m_bVerboseMenuComing) { m_bVerboseMenuComing = FALSE; m_strOutput += pInputString; bDone = TRUE; } break; case OUTPUTNAMEPKT: Form1->RzExpandEdit1->Text = Form1->RzExpandEdit1->Text +" OUTPUTNAMEPKT"+String(pak); if(MLGetString(m_mlinkp, &pOutputString)) { m_strOutputPrompt = pOutputString; MLDisownString(m_mlinkp, pOutputString); } break; case RETURNTEXTPKT: Form1->RzExpandEdit1->Text = Form1->RzExpandEdit1->Text +" RETURNTEXTPKT"+String(pak); if(MLGetString(m_mlinkp, &pOutputString)) { pOutputString = fnReplaceSlashZeroOneTwo((CHAR*)pOutputString); m_strOutput += pOutputString; m_strOutput += "\n"; MLDisownString(m_mlinkp, pOutputString); } break; case RETURNPKT: //MLNewPacket(m_mlinkp); Form1->RzExpandEdit1->Text = Form1->RzExpandEdit1->Text +" RETURNTPKT"+String(pak); read_and_print_expression(m_mlinkp); break; case DISPLAYPKT: Form1->RzExpandEdit1->Text = Form1->RzExpandEdit1->Text +" DISPLAYPKT"+String(pak); if(TRUE == m_bFirstPiece) { m_strGraphic = ""; m_bFirstPiece = FALSE; } if(MLGetString(m_mlinkp, &pOutputString)) { m_strGraphic += pOutputString; //fnOpenWMFFile(AnsiString(m_strGraphic).c_str()); MLDisownString(m_mlinkp, pOutputString); } break; case DISPLAYENDPKT: Form1->RzExpandEdit1->Text = Form1->RzExpandEdit1->Text +" DISPLAYENDPKT"+String(pak); if(MLGetString(m_mlinkp, &pOutputString)) { fnOpenWMFFile(pOutputString); MLDisownString(m_mlinkp, pOutputString); } m_bFirstPiece = TRUE; break; case SYNTAXPKT: Form1->RzExpandEdit1->Text = Form1->RzExpandEdit1->Text +" SYNTAXPKT"+String(pak); MLGetInteger(m_mlinkp, &iSyntaxErrorPosition); m_strOutput += pInputString; m_strOutput += pInputString; memset(pInputString, ' ', iSyntaxErrorPosition); m_strOutput += pInputString; break; case INPUTSTRPKT: Form1->RzExpandEdit1->Text = Form1->RzExpandEdit1->Text +" INPUTSTRPKT"+String(pak); if(MLGetString(m_mlinkp, &pOutputString)) { m_strInputPrompt = pOutputString; MLDisownString(m_mlinkp, pOutputString); } m_eInputMode = StringExpected; bDone = TRUE; break; case MENUPKT: MLGetInteger(m_mlinkp, &iInterruptMenu); if(MLGetString(m_mlinkp, &pOutputString)) { strcpy(pInputString, pOutputString); MLDisownString(m_mlinkp, pOutputString); } m_eInputMode = StringExpected; if(iInterruptMenu == 0) m_bVerboseMenuComing = TRUE; else { m_strInputPrompt = pInputString; bDone = TRUE; } break; case MESSAGEPKT: Form1->RzExpandEdit1->Text = Form1->RzExpandEdit1->Text +" MESSAGEPKT"+String(pak); MLGetSymbol(m_mlinkp, &pOutputString); m_strMsgInfo += pOutputString; MLDisownString(m_mlinkp, pOutputString); MLGetString(m_mlinkp, &pOutputString); m_strMsgInfo += "::"; m_strMsgInfo += pOutputString; m_strMsgInfo += "\n"; MLDisownString(m_mlinkp, pOutputString); break; case SUSPENDPKT: m_strOutput += "***SUSPENDED***"; m_strOutput += "\n"; MLNewPacket(m_mlinkp); bDone = TRUE; break; case RESUMEPKT: m_strOutput += "***RESUMED***"; m_strOutput += "\n"; MLNewPacket(m_mlinkp); break; case BEGINDLGPKT: { CHAR buffer[32]; MLGetInteger(m_mlinkp, &m_iDialogLevel); m_strOutput += "Entering Dialog: "; m_strOutput += itoa(m_iDialogLevel, buffer, 10); m_strOutput += "\n"; } break; case ENDDLGPKT: { char buffer[32]; MLGetInteger(m_mlinkp, &m_iDialogLevel); m_iDialogLevel--; m_strOutput += "Leaving Dialog: "; m_strOutput += itoa(m_iDialogLevel, buffer, 10); m_strOutput += "\n"; } break; } if(fnCheckError(m_mlinkp)) return FALSE; } return TRUE; } void CMathLink::read_and_show_expression(MLINK mlinkp) { kcharp_ct s; int n,n1; int i, len; double r; // const char *string1; // MLGetFunction(mlinkp,&string1,&n1); // MLGetInteger32(mlinkp,&n1); // string1= AnsiString(n1).c_str() ; // Form1->Edit2->Text = AnsiString(MLGetNext(mlinkp)).c_str() ; // Form1->Edit2->Text = string1; static int indent; // MLGetNext(mlinkp); // MLGetNext(mlinkp); switch( MLGetNext(mlinkp)) { case MLTKSYM: MLGetSymbol(mlinkp, &s); m_strOutputExpression = s; MLDisownSymbol(mlinkp, s); break; case MLTKSTR: MLGetString(mlinkp, &s); m_strOutputExpression = s; MLDisownString(mlinkp, s); break; case MLTKINT: Form1->Edit2->Text = "gc"; MLGetInteger( mlinkp, &n); m_strOutputExpression = AnsiString(n).c_str(); break; case MLTKREAL: MLGetReal(mlinkp, &r); m_strOutputExpression = AnsiString(n).c_str(); break; case MLTKFUNC: indent += 3; printf( "/n %*.*s", indent, indent, ""); if( MLGetArgCount(mlinkp, &len) == 0){ fnCheckError(mlinkp); }else{ read_and_show_expression(mlinkp); printf( "["); for( i = 1; i <= len; ++i){ read_and_show_expression(mlinkp); if( i != len) printf( ", "); } printf( "]"); } indent -= 3; break; case MLTKERROR: default: fnCheckError(mlinkp); } } /* int CMathLink::read_and_print_function(MLINK mlinkp) { int len, i; static int indent; if( ! MLGetArgCount(mlinkp, &len)) return 0; indent += 3; printf( "\n%*.*s", indent, indent, ""); if( read_and_print_expression(mlinkp) == 0) return 0; printf( "["); for( i = 1; i <= len; ++i) { if( read_and_print_expression(mlinkp) == 0) return 0; if( i < len) printf( ", "); } printf( "]"); indent -= 3; return 1; } void CMathLink::read_and_print_atom(MLINK mlinkp, int tag) { const char *s;//expression用 if( tag == MLTKSTR) putchar( '"'); if( MLGetString(mlinkp, &s)){ //printf( "%s", s); Form1->Memo1->Text = AnsiString(s).c_str(); // Form1->Edit2->Text = AnsiString(tag).c_str(); MLDisownString(mlinkp, s); } if( tag == MLTKSTR) putchar( '"'); putchar( ' '); // return MLError(mlinkp) == MLEOK; } */ INT CMathLink::fnOpenWMFFile(const CHAR *pFileString) { Form1->Image1->Picture->Metafile->LoadFromFile(pFileString); Form1->Image1->Picture->Graphic->SetSize(180*3,172*3); //Form1->Image1->Stretch = True; Form1->cxImage1->Picture ->Metafile ->LoadFromFile(pFileString); Form1->cxImage1->Picture ->Graphic->SetSize(180*3,172*3); //Form1->cxImage1->Picture ->Graphic->Width = Form1->cxImage1->Width; /* HENHMETAFILE theMetafile; APMHEADER theAPMHeader; METAFILEPICT theWMFHeader; FILE *theFile; HDC hdcMetafile; BYTE *metafileBits; LONG metafileSize; theFile = fopen(pFileString, "rb"); if(NULL == theFile) { return 0; } fseek(theFile, 0, SEEK_END); metafileSize = ftell(theFile) - sizeof(theAPMHeader); rewind(theFile); fread(&theAPMHeader, 1, sizeof(theAPMHeader), theFile); if(theAPMHeader.dwKey != 0x9ac6cdd7l || theAPMHeader.wCheckSum != fnCalculateAPMCheckSum(&theAPMHeader)) { fclose(theFile); return 0; } metafileBits = (BYTE *)malloc(sizeof(unsigned char) * metafileSize); if(NULL == metafileBits) { fclose(theFile); return 0; } fread(metafileBits, 1, metafileSize, theFile); fclose(theFile); theWMFHeader.mm = MM_ANISOTROPIC; theWMFHeader.xExt = theAPMHeader.bbox.Right - theAPMHeader.bbox.Left; theWMFHeader.xExt = (theWMFHeader.xExt * 2540l)/(DWORD)theAPMHeader.wInch; theWMFHeader.yExt = theAPMHeader.bbox.Bottom - theAPMHeader.bbox.Top; theWMFHeader.yExt = (theWMFHeader.yExt * 2540l)/(DWORD)theAPMHeader.wInch; theWMFHeader.hMF = NULL; hdcMetafile = GetDC(NULL); theMetafile = SetWinMetaFileBits(metafileSize, metafileBits, hdcMetafile, &theWMFHeader); free(metafileBits); ReleaseDC(NULL, hdcMetafile); if(NULL != m_hemfGlobal) DeleteEnhMetaFile(m_hemfGlobal); m_hemfGlobal = theMetafile; remove(pFileString); */ return 1; } WORD CMathLink::fnCalculateAPMCheckSum(const APMHEADER * apmfh) { LPWORD lpWord; WORD wResult, i; wResult = *(lpWord = (LPWORD)(apmfh)); // Start with the first word for(i = 1; i <= 9; i++) // XOR in each of the other 9 words wResult ^= lpWord; return wResult; } void __fastcall TForm1::Button1Click(TObject *Sender) { CMathLink ML1("D:\\Program Files\\Mathematica\\9.0\\mathkernel"); ML1.Connect(); ML1.Evaluate(AnsiString(Edit1->Text).c_str()); Memo1->Text = ML1.GetOutputExpression(); RichEdit1->Text = ML1.GetGraphicInfo(); //Image1->Picture->Metafile->LoadFromFile(ML1.GetOutputInfo()); cxRichEdit1 ->SelText = ML1.GetOutputInfo(); RzRichEdit1 ->Text = ML1.GetOutputInfo(); // RzExpandEdit1 ->Text = ML1.GetMsgInfo(); ML1.Disconnect() ; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { CMathLink ML2("D:\\Program Files\\Mathematica\\9.0\\mathkernel"); ML2.Connect(); // ML2.Evaluate(AnsiString(Edit1->Text).c_str()); ML2.expEvaluate(AnsiString(Form1->Edit1->Text).c_str()) ; ML2.Disconnect() ; } //--------------------------------------------------------------------------- void __fastcall TForm1::ListBox1Click(TObject *Sender) { //Edit1->Text = ListBox1->Items->GetText(); Edit1->Text = ListBox1->Items->Strings[ListBox1->ItemIndex]; } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { ListBox1->Items->Add("RegionPlot3D[x^2 + y^3 - z^2 > 0, {x, -2, 2}, {y, -2, 2}, {z, -2, 2}]"); ListBox1->Items->Add("Plot3D[Sin[x + Cos[y]], {x, -4, 4}, {y, -4, 4}]"); ListBox1->Items->Add("Plot[Sin[x], {x, 0, 6 Pi}]"); ListBox1->Items->Add("Plot[{Sin[x], Sin[2 x], Sin[3 x]}, {x, 0, 2 Pi}, PlotLegends -> \"Expressions\"]"); ListBox1->Items->Add("Plot[Evaluate[Table[BesselJ[n, x], {n, 4}]], {x, 0, 10},Filling -> Axis]"); ListBox1->Items->Add("ContourPlot[Cos[x] + Cos[y] == 1/2, {x, 0, 4 Pi}, {y, 0, 4 Pi}]"); ListBox1->Items->Add("DensityPlot[Sin[x] Sin[y], {x, -4, 4}, {y, -3, 3}, Mesh -> 10]"); ListBox1->Items->Add("Solve[x^2 + a x + 1 == 0, x]"); ListBox1->Items->Add("NSolve[x^5 - 2 x + 3 == 0, x]"); ListBox1->Items->Add("NSolve[{x^2 + y^2 == 1, x^3 + y^3 == 2}, {x, y}]"); ListBox1->Items->Add("RegionPlot[x^2 + y^2 < 1, {x, -1, 1}, {y, -1, 1}, Mesh -> 10,MeshShading -> {{Automatic, None}, {None, Automatic}}, ColorFunction -> \"DarkRainbow\"]"); ListBox1->Items->Add("data1 = RandomVariate[NormalDistribution[2, 3], 100];data2 = RandomVariate[StudentTDistribution[4, 2, 1], 200];ProbabilityPlot[{data1, data2},PlotLegends -> {\"normal\", \"Student t\"}]"); ListBox1->Items->Add("{sol, points} = Reap@NDSolve[{x'[t] == -y[t] - x[t]^2, y'[t] == 2 x[t] - y[t]^3,p'[t] == Sqrt[Derivative[1][x][t]^2 + Derivative[1][y][t]^2],x[0] == y[0] == 1, p[0] == 0,WhenEvent[Sin[Pi*p[t]] == 0, Sow[t]]}, {x, y, p}, {t, 100}];ParametricPlot[{x[t], y[t]} /. sol, {t, 0, 100}, Mesh -> points,MeshShading -> {Green, Orange}, PlotRange -> All]"); } //--------------------------------------------------------------------------- static int read_and_print_expression(MLINK lp) { int tag; const char * f; switch (tag = MLGetType( lp)) { case MLTKSYM: case MLTKSTR: Form1->Edit2->Text = AnsiString(tag).c_str() ; // return read_and_print_atom( lp, tag); case MLTKINT: Form1->Edit2->Text = AnsiString(tag).c_str() ; return read_and_print_atom( lp, tag); case MLTKREAL: return read_and_print_atom( lp, tag); case MLTKFUNC: return read_and_print_function( lp); case MLTKERROR: //case MLTKGRAF; default: return 0; } 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) { const char *s; if( MLGetString( lp, &s)){ Form1->Edit2->Text = Form1->Edit2->Text + String(s); Form1->Memo1->Text = AnsiString(s).c_str(); MLDisownString( lp, s); } 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); } |
2楼2015-06-17 19:12:11













回复此楼