- 注册时间
- 2009-2-12
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 22688
- 在线时间
- 小时
|
发表于 2018-1-6 00:26:51
|
显示全部楼层
仿照例子,安装目录下【/usr/local/Wolfram/Mathematica/11.2/SystemFiles/Links/WSTP/DeveloperKit/Linux-x86-64】,写了一个测试C/C++测试程序。基本跑通需求。
存在的问题就是到底怎么设置时间的check point才算合理,不是特别的清楚。我先把代码贴出来,有兴趣的自己可以试试。暂时不打算继续较真下去了,到此为止。(反正Mathematica是输了还是赢了,跟我没任何关系, ^_^)
编译的命令如下:
- g++ main.cxx -I. -L. -lWSTP64i4 -lm -lpthread -lrt -ldl -luuid -std=c++11
- LD_LIBRARY_PATH=. ./a.out -linkname "math -wstp"
复制代码
- #include <iostream>
- #include <chrono>
- #include <cmath>
- #include "wstp.h"
- static WSENV ep = (WSENV)0;
- static WSLINK lp = (WSLINK)0;
- static void error( WSLINK lp)
- {
- if( WSError( lp)){
- fprintf( stderr, "Error detected by WSTP: %s.\n",
- WSErrorMessage(lp));
- }else{
- fprintf( stderr, "Error detected by this program.\n");
- }
- exit(3);
- }
- static void deinit( void)
- {
- if( ep) WSDeinitialize( ep);
- }
- static void closelink( void)
- {
- if( lp) WSClose( lp);
- }
- static void init_and_openlink( int argc, char* argv[])
- {
- int err;
- ep = WSInitialize( (WSParametersPointer)0);
- if( ep == (WSENV)0) exit(1);
- atexit( deinit);
- lp = WSOpenArgv( ep, argv, argv + argc, &err);
- if(lp == (WSLINK)0) exit(2);
- atexit( closelink);
- }
- static void read_and_print_expression( WSLINK lp)
- {
- const char *s;
- int n;
- int i, len;
- double r;
- static int indent;
- switch( WSGetNext( lp)) {
- case WSTKSYM:
- std::cout<< __LINE__ <<std::endl;
- WSGetSymbol( lp, &s);
- printf( "%s ", s);
- WSReleaseSymbol( lp, s);
- break;
- case WSTKSTR:
- std::cout<< __LINE__ <<std::endl;
- WSGetString( lp, &s);
- printf( ""%s" ", s);
- WSReleaseString( lp, s);
- break;
- case WSTKINT:
- std::cout<< __LINE__ <<std::endl;
- WSGetInteger( lp, &n);
- printf( "%d ", n);
- break;
- case WSTKREAL:
- // std::cout<< __LINE__ <<std::endl;
- WSGetReal( lp, &r);
- printf( "%g ", r);
- break;
- case WSTKFUNC:
- std::cout<< __LINE__ <<std::endl;
- indent += 3;
- printf( "\n %*.*s", indent, indent, "");
- if( WSGetArgCount( lp, &len) == 0){
- error( lp);
- }else{
- read_and_print_expression( lp);
- printf( "[");
- for( i = 1; i <= len; ++i){
- read_and_print_expression( lp);
- if( i != len) printf( ", ");
- }
- printf( "]");
- }
- indent -= 3;
- break;
- case WSTKERROR:
- std::cout<< __LINE__ <<std::endl;
- default:
- error( lp);
- }
- }
- int main(int argc, char* argv[])
- {
- init_and_openlink( argc, argv);
- int pkt,x,n;
- std::cout<< "put x: "<<std::endl;
- std::cin>>x;
- std::cout<< "put n: "<<std::endl;
- std::cin>>n;
- std::string cmd = "N[Log["+std::to_string(x)+"],"+std::to_string(n)+"]";
- std::cout<< "Expression: "<<cmd<<std::endl;
- // WSPutFunction( lp, "N", 2);
- // WSPutFunction( lp, "Log", 1);
- // WSPutInteger( lp, x);
- // WSPutInteger( lp, n);
- // WSEndPacket( lp);
- WSPutFunction(lp, "ToExpression", 1);
- WSPutString(lp, cmd.c_str());
- WSEndPacket(lp);
- while( (pkt = WSNextPacket(lp), pkt) && pkt != RETURNPKT) {
- WSNewPacket( lp);
- if (WSError( lp)) error( lp);
- }
- auto t1 = std::chrono::high_resolution_clock::now();
- read_and_print_expression( lp);
- auto t2 = std::chrono::high_resolution_clock::now();
- std::cout<< "cost:"<<std::chrono::duration_cast<std::chrono::microseconds>(t2 - t1).count()/1000.<<"ms"<<std::endl;
- WSPutFunction( lp, "Exit", 0L);
- return 0;
- }
复制代码 |
|