lingo与高级语言连接(以C++)为例
2016-08-31 12:13
344 查看
我第一次接触lingo是数学建模课上老师介绍的,但是有matlab,所以lingo一直用的不多。最近偶然的机会接触到了C++调用lingo,发现网上资料很少,而且基本都残缺不全,因此这里整理一下自己的分析。
这里不再赘述lingo是什么,直接上正文。
首先在lingo的安装目录下,发现有“Programming Samples”文件夹,这里面放的都是lingo与其它语言连接的例子:ASPNET、C#NET、Excel(也就是宏)、Fortran、Java、VBNET、VBScript、VC++。这里以C++为例分析一下常用的几种情况。
甚至直接
当然,C一出来之后在C Programing Language一书中一直都是
而在lingo给的示例中也不例外,这第一种调用方法中,示例给出的程序需要给C程序传个argv的参数(也就是要调用的lingo函数名+\n+GO,例如Tran.lng \n GO)。当然,直接写程序的时候也可以在程序中给argv赋值,是一样的。
下面这一段直接拿来用就可以(感觉这个写的就不错,除了追求风格外,没什么必要改了)
下面开始传参,
dProfit是C++程序中的参数,要传给lingo的。
下面开始执行调用,
想想其实没什么,就是做完了准备lingo环境这些准备工作之后传参数,之后以LSexecuteScriptLng函数调用就可以了。
非要说这个程序的问题所在,个人感觉是用了goto这个让人生畏的东西,不过没有造成“面条”,那就没什么大不了的。
这里值得注意的一点在lingo程序上。单独执行lingo程序的时候,profit = @pointer( 1);和@pointer(4) = rObj;放在哪其实没差别,但是跟C++一结合就有问题了:不是报错,而是cmd下显示“Parameter?”
我曾为这一点纠结好久,终于发现lingo传入的参数要放在计算过程前面,而传出的参数要放在计算过程后面。我参测这是由于VS编译器所造成的原因。
不过不得不说这样更“友好”一些。
PS:本文给出的例子在lingo的安装目录下都可以找到,lingo安装不全或者其他原因找不到的可以在评论区留言。
这里不再赘述lingo是什么,直接上正文。
首先在lingo的安装目录下,发现有“Programming Samples”文件夹,这里面放的都是lingo与其它语言连接的例子:ASPNET、C#NET、Excel(也就是宏)、Fortran、Java、VBNET、VBScript、VC++。这里以C++为例分析一下常用的几种情况。
C++调用lingo之一——直接调用
这里要涉及一点C的main函数的知识。我发现很多人写c的主函数要不就是int main()
甚至直接
void main()
当然,C一出来之后在C Programing Language一书中一直都是
int main(int argc, char* argv[])
而在lingo给的示例中也不例外,这第一种调用方法中,示例给出的程序需要给C程序传个argv的参数(也就是要调用的lingo函数名+\n+GO,例如Tran.lng \n GO)。当然,直接写程序的时候也可以在程序中给argv赋值,是一样的。
C++调用lingo之二——传参
传参的程序比直接调用稍显复杂,不过至少有例可循。下面这一段直接拿来用就可以(感觉这个写的就不错,除了追求风格外,没什么必要改了)
// create the LINGO environment object pLSenvLINGO pLINGO; pLINGO = LScreateEnvLng(); if ( !pLINGO) { printf( "Can''t create LINGO environment!\n"); goto FinalExit; } // Pass LINGO a pointer to our callback function nCallbacks = 0; nError = LSsetCallbackSolverLng( pLINGO, &MyCallback, &nCallbacks); if ( nError) goto ErrorExit; // Pass LINGO a pointer to our callback function nCallbacks = 0; nError = LSsetCallbackErrorLng( pLINGO, &MyErrorCallback, NULL); if ( nError) goto ErrorExit; // Open LINGO's log file nError = LSopenLogFileLng( pLINGO, "LINGO.log"); if ( nError) goto ErrorExit;
下面开始传参,
// @POINTER(1) nError = LSsetPointerLng( pLINGO, dProfit, &nPointersNow); if ( nError) goto ErrorExit;
dProfit是C++程序中的参数,要传给lingo的。
下面开始执行调用,
// Here is the script we want LINGO to run strcpy( cScript, "SET ECHOIN 1 \n TAKE SIMPLE.LNG \n GO \n QUIT \n"); // Run the script nError = LSexecuteScriptLng( pLINGO, cScript); if ( nError) goto ErrorExit; // Close the log file LScloseLogFileLng( pLINGO); // Any problems? if ( nError || dStatus != LS_STATUS_GLOBAL_LNG) { // Had a problem printf( "Unable to solve!"); } else { // Everything went OK ... print results printf( "\nStandards: %g \nTurbos: %g \nProfit: %g \n", dProduce[0], dProduce[1], dObjective); } goto NormalExit; ErrorExit: printf("LINGO Error Code: %d\n", nError); NormalExit: LSdeleteEnvLng( pLINGO); FinalExit: ;
想想其实没什么,就是做完了准备lingo环境这些准备工作之后传参数,之后以LSexecuteScriptLng函数调用就可以了。
非要说这个程序的问题所在,个人感觉是用了goto这个让人生畏的东西,不过没有造成“面条”,那就没什么大不了的。
这里值得注意的一点在lingo程序上。单独执行lingo程序的时候,profit = @pointer( 1);和@pointer(4) = rObj;放在哪其实没差别,但是跟C++一结合就有问题了:不是报错,而是cmd下显示“Parameter?”
我曾为这一点纠结好久,终于发现lingo传入的参数要放在计算过程前面,而传出的参数要放在计算过程后面。我参测这是由于VS编译器所造成的原因。
C++调用lingo之三——基于对话框的MFC
进一步的例子是基于对话框的MFC程序,所有前面讲到的“套路”都在自定义的按钮“OnSolve”里面,无非是多了几个类什么的(回点C++或者写过MFC的都知道),那就不是本文要探讨的东西了。不过不得不说这样更“友好”一些。
PS:本文给出的例子在lingo的安装目录下都可以找到,lingo安装不全或者其他原因找不到的可以在评论区留言。
相关文章推荐
- 高级语言采用左连接统计总和
- J2ME in a Nutshell(翻译版) :第二章 连接有限设备配置CLDC,2.1.1虚拟机和语言特性
- 面向对象语言概论(三) 基于类的高级特性
- 高级程序设计语言2的作业有点难
- HTML高级教程 亲和力的连接
- 汇编代码对应的高级语言分析
- 搜客天下网络信息采集器高级用法:虎客语言1
- 脚本语言:21世纪的高级编程语言
- 汇编代码对应的高级语言分析
- (低级语言 || 高级语言) && (编译 || 解释)
- 着色器和效果——1.0 介绍高级着色语言
- 看了高级语言所说的解耦,联想到400的rpgle
- C06(高级语言特征)
- Java学习备忘录(五)高级语言特性篇(原创)
- lingo与电子表格的相互连接
- Servlet中jdbc应用高级篇(得到和返回连接 )
- java高级语言特性
- 高级语言中函数调用对栈的应用
- 非典型性C语言教程- 0.4 连接
- 自考“高级语言程序设计”上机考点串讲(2)