C程序移植到VC开发环境下

说明

本文是作者学习计算方法时所做工作的总结。我们改写了徐士良先生编著的《C常用算法程序集》(清华大学出版社出版)

数值计算部分-前15章所有程序,并全部在 VC6 + Windows2000 下调试通过。数组类和矩阵类有两个版本:封装成模板类、普通类,我个人认为后者可能更实用,但论文中以模板类形式给出。

本文已经在www.vchelp.net上发表过,该网站允许作者另投其他网站。

摘要

针对C程序的特点,给出将之移植到VC集成环境下的技术,对一个常用程序集实施了大规模的改写,并提供了C++数组和矩阵模板类,对C程序进行面向对象的封装。The Migration of Old C Code to Visual C++ IDE
Abstract: According to the character of C programs, this paper presents some techniques to migrate them to Visual C++ IDE,
as a implemention, it reprograms a set of numerical arithmetic programs for further engineering use.
关键词:移植;数值计算;封装;模板类Key words: Migration; Numerical Arithmetic, Encapsulation, Template Class 一、引言

由于C语言长期广泛应用,现存有大量经过严格检验的实用C程序,它们可以用来很好地解决工程应用中的实际问题。但是旧的C程序往往有很多与现代编译器不兼容的地方,因此我们要根据具体的代码情况进行相应的移植处理。

本文以改写清华大学出版社出版的C常用算法程序集(以下简称"程序集")为例,说明如何将旧的C程序移植到目前普遍使用的C/C++开发环境Visual C++下。除了列举一些移植程序的方法和技巧,本文还给出两个C++类:数组类和矩阵模板类,以例示如何对C程序进行面向对象的包装处理。

二、基于C语言分析和改换

我们知道,Visual C++支持ANSI C,下面列举源代码影响编译、不兼容的情况和相应解决方案,并给出基于ANSI C标准的函数的基本调用例子。

1、函数定义参数声明没有采用现代风格,例如全选主元高斯消去法:int agaus(a,b,n)
int n;
double a[],b[];
{……;}
参数声明应改为数组形式:int agaus(double a[],double b[],int n) 或者改为指针形式:int agaus(double* a,double* b,int n); 调用方法:agaus(&a[0][0],&b[0],n);
/* a二维双精度型数组、b一维双精度型数组,n整型变量 */

C/C++中用下标法和指针法都可以访问一个数组,设有数组a,则a[i]和*(a+i)无条件等价。如果指针变量p指向数组中的一个元素,则p+1指向同一数组的下一个元素。若p的初值为&a[0],则p+i和a+I都是a[i]的地址;*(p+i)和*(a+i)就是p+i或a+i所指向的数组元素,即a[i];指向数组的指针变量也可以带下标,如p[i]与*(p+i)等价。所以,在实际使用该函数,如果遇到数组作形参,可以将数组第一个元素地址作为实参传值调用函数。

2、动态存储分配函数返回void*型指针变量,它指向一个抽象类型的数据,ANSI C标准规定在将它赋值给另一个指针变量时需要进行强制类型转换,所以下面代码Line1要用Line2替换:double* v;
v=malloc(n*m*sizeof(double));/* Line1 */
v=(double*)malloc(n*m*sizeof(double));
/* Line2 */
3、某些算法函数可能要调用一些用户自定义函数,如最佳一致逼近的里米兹方法:void hremz(a,b,p,n,eps)
int n;
double a,b,eps,p[];
{
  extern double hremzf();
  …
}
原方法使程序集与应用程序的耦合程度增加,缺乏灵活性,可以改为:void hremz(double a,double b,double p[],int n,double eps,double (*hremzf)(double x))
{…}
用函数指针作参数,调用时直接将函数名作实参即可: hremz(a,b,p,4,eps,hremzf); /* 假设各参数在主程序文件已定义 */

4、有的时候需要将一些函数的控制台输出作为字符串值返回,比如:

printf("%c",xy[i][j]);我们可以用形似sprintf( buffer,"%c",xy[i][j]),
    strcat( str, buffer );
的合并语句(其中str是一个足够大的字符串数组参数)代替printf("%c",xy[i][j]);例如:char* buffer;
    buffer =(char*)malloc(n*sizeof(char)); /*n作为参数传递,例如100 */
    sprintf( buffer,"%c",xy[i][j]),
    strcat( str, buffer );
    /*把终端输出字符添加到str 串尾*/
    ......
    free(buffer)
如果用到了它们,调用方法以随机样本分析为例:

char str[1024];
    str[0]=''\0'';/*初始化为空串*/
    irhis(x,100,x0,h,10,1,&dt[0],&g[0],&q[0],str);

现在str数组保存了终端输出文本,可以随意使用它,比如在控制台程序里输出:

puts(str);

在使用MFC类库时,str可以直接赋值给一个CString对象的实例。 经过以上的工作,我们得到基于ANSI C标准的程序版本,可以在C和C++开发环境下使用。

时间: 2024-09-09 11:08:36

C程序移植到VC开发环境下的相关文章

在VC++开发环境中整合Pro*C/C++

c++ 本文所讨论的内容基于以下环境:Microsoft Visual C++ 6.0ORACLE 8i (8.1.7) 当前版本:1.0 (041221) 声明:本文所述的某些操作可能对系统产生重大影响,请慎重操作!本人不对此产生的任何后果负责! 在VC++开发环境中整合Pro*C/C++Pro*C/C++为C/C++语言访问ORACLE数据库提供了极大的方便,但是,在编译的时候往往需要在命名行模式下编译pc文件,而目前多数开发都是在VC++这种整合开发环境中完成的,要在两者之间不停的切换,不

ide-在vc6以后的微软各vc开发环境里怎么实现dll的隐式加载呢?

问题描述 在vc6以后的微软各vc开发环境里怎么实现dll的隐式加载呢? 我之前在VC6里用隐式加载dll的方法,貌似在VC新的IDE下不可行,总是链接不成功,这是怎么回事?怎么解决呢???? 解决方案 一样呃方式,工程属性中Lib中添加需要隐式连接的lib库文件,以及配置好库文件所在的目录 解决方案二: VC6中的DLL调试 解决方案三: 什么"隐式加载",你说的是静态链接吧.http://blog.csdn.net/youxin2012/article/details/115384

框架-C# network comms的服务端程序一定放置在服务器环境下吗 比如做一个即时通讯系统

问题描述 C# network comms的服务端程序一定放置在服务器环境下吗 比如做一个即时通讯系统 有的人做的即时通讯软件客户端和服务端都是在windows系统下直接运行 就是exe文件 如果用这个框架做是不是还得部署到服务器环境下 初次接触网络通信编程 以前也写过用网络通讯程序 ,只是简单的手机控制电脑关机 用不到框架 现在用感觉一头雾水网上都没入门教程直接就是小案例下载下来也无法运行 解决方案 没必要,客户端操作系统就可以.但是服务器操作系统更适合生产环境,它的配置是面向服务器环境的(比

做了一个MVC项目 有一个图片文件夹有4万多张图片 开发环境下卡的不行 有谁遇见这问题能解决

问题描述 做了一个MVC项目有一个图片文件夹有4万多张图片开发环境下卡的不行有谁遇见这问题能解决 解决方案 解决方案二:图片都放图片服务器上去--解决方案三:木有图片服务器解决方案四:如果你是使用控制台方式来列目录,没有问题.如果你使用windows资源管理器.或者某些开发工具列目录方式,特别是"缩略图"查看形式,那么就会卡.你可以把图片分成不同目录层次,例如按照第一个字母分放一层,然后第一层中每一个目录中再按第二个字母分放一层,然后第二层中每一个目录再按照第3个字母分放一层.如此分割

将php一个项目文件夹复制到Linux开发环境下无法访问

问题描述 将php一个项目文件夹复制到Linux开发环境下无法访问 在Windows下有个名为b2b的项目文件夹,放到htdocs下之后,用http://localhost/b2b/index.php 可以访问得到它,但是我将其复制到Linux下我的开发环境中(var/www/html)的时候,访问 都是出404错误,即not found!我仔细看了下,无论访问路径,还是文件夹权限都没问题.而且访问 同目录下的其他php文件都没事,就b2b文件夹都访问不了.始终没明白是哪里出了问题 求大神解答下

ise-如何在ISE开发环境下对信号进行希尔伯特(hilbert)变换?

问题描述 如何在ISE开发环境下对信号进行希尔伯特(hilbert)变换? 新手小白,想对数字信号进行希尔伯特变换,最好采用IP核.我用的是ISE14.7版本,其中有个FIR的IP核(版本6.3)可以选择希尔伯特滤波器,但我不知道应该如何设置.请大神帮忙,跪谢了! 另:所需要处理的信号是14位的 解决方案 ** 首先在matlab界面中设置好hilbert滤波器系数,然后按照正常方法将滤波器系数保存,在那个fir滤波器设计界面中直接浏览设计好的滤波器系数文件就可以了,主要是hilbert滤波器系

xdebug-zend studio+IIS+mysql开发环境下Xdeug调试配置失败

问题描述 zend studio+IIS+mysql开发环境下Xdeug调试配置失败 配置基本没错,但是在调试的时候,出现了如下的提示,求大神指教

《ASP.NET MVC 4 实战》----第 2 章 第一个MVC应用程序 2.1 设置开发环境

第 2 章 第一个MVC应用程序 ASP.NET MVC 4 实战 本章内容 本章将介绍Guestbook(留言簿)应用程序,它也是本书第1部分的其余章节所使用的示例.Guestbook是一个简单的应用程序,它让用户向网站递交他们的姓名和消息,并查看其他用户递交的消息.虽然这个Guestbook的概念很简单,但是我们将用它来考察ASP.NET MVC的核心组件. 在本书的第1部分中,我们将建立这个示例.为了使用MVC应用程序,首先看看需要安装的开发工具,然后创建Guestbook应用程序的初步骨

请教--C#开发环境下Arcnet接口编程

问题描述 本人最近做一个软件项目,上位计算机通过Arcnet接口与仪器通信,读取仪器内的数据,哪位兄弟姐妹知道怎么进行Arcnet编程吗?我用的是C#开发环境!