lingo与高级语言连接(以C++)为例

原创 2016年08月31日 12:13:29

我第一次接触lingo是数学建模课上老师介绍的,但是有matlab,所以lingo一直用的不多。最近偶然的机会接触到了C++调用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安装不全或者其他原因找不到的可以在评论区留言。

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

LINGO调用VC编写的函数动态库实验

Visual C++编写函数,然后用动态库的形式输出该函数供LINGO调用. 某公司生产A,B和C三种产品,售价分别是12元、7元和6元.生产每件A产品需要1小时技术服务、10小时直接劳动、...
  • whucv
  • whucv
  • 2012-08-31 22:50
  • 2349

lingo与高级语言连接(以C++)为例

C++调用lingo简介

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

c语言 连接 mysql 例程

学习mysql 和c++都已经有半年了。 我以为我可以很轻易的就写出一个至少自己可以用的c++连接msyql的类。 可是,尝试了好几次,都是无功而返。总是遇到这样那样的问题。 今天,在网上看到别...

linux下c语言udp连接实例

// // Created by 冰糖葫芦的夏天 on 16-7-15. // server_udp.c #include #include #include #include #define ...

汇编语言与高级语言

汇编语言与高级语言

C语言高级指针

函数指针 当声明一个函数指针时,必须声明它指向的函数类型,即要指出函数的返回类型以及函数的参数类型。 声明一个指向特定函数类型的指针的简单方法是,首先声明一个该类型的函数,然后用( *pf )形式的表...

C语言高级篇

这篇博客是本人学C语言高级部分时整理的个人心得,有些是学校学不到的,特此分享给有缘人!

C语言_高级指针

高级指针

c语言中 ## 连接符与# 符

## 连接符与# 符         ##连接符号由两个井号组成,其功能是在带参数的宏定义中将两个子串(token)联接起来,从而形成一个新的子串。但它不可以是第一个或者最后一个子串。所谓的子...

c语言mysql连接

工程项目中经常要与mysql交互,留下自己写的接口,方便下次使用, mysql.h #ifndef MYSQL_H #define MYSQL_H #include "/usr/include/m...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)