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

捉急青年

捉急青年

2016-01-29 12:14

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

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


作者:胡金山,史亚锋
空军工程大学工程学院一系飞机教研室 西安710038

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/cyuyanjiaocheng/)

下载源代码

说明
    本文是作者学习计算方法时所做工作的总结。我们改写了徐士良先生编著的《C常用算法程序集》(清华大学出版社出版)
数值计算部分-前15章所有程序,并全部在 VC6 + Windows2000 下调试通过。数组类和矩阵类有两个版本:封装成模板类、普通类,我个人认为后者可能更实用,但论文中以模板类形式给出。

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

摘要
    针对C程序的特点,给出将之移植到VC集成环境下的技术,对一个常用程序集实施了大规模的改写,并提供了C++数组和矩阵模板类,对C程序进行面向对象的封装。

The Migration of Old C Code to Visual C++ IDEAbstract: 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"      
展开更多 50%)
分享

猜你喜欢

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

C语言教程 C语言函数
C程序移植到VC开发环境下

JSP在Window环境下程序开发环境配置

Web开发
JSP在Window环境下程序开发环境配置

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

Linux下C开发环境的构成和安装

Linux Linux命令 Linux安装 Linux编程 Linux桌面 Linux软件 Linux内核 Linux管理
Linux下C开发环境的构成和安装

Windows操作系统下JSP程序开发环境配置

Web开发
Windows操作系统下JSP程序开发环境配置

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

使用VB开发Windows环境下的串行通信程序

编程语言 网络编程
使用VB开发Windows环境下的串行通信程序

托管C++程序开发—Win表单文档程序设计(下)

C语言教程 C语言函数
托管C++程序开发—Win表单文档程序设计(下)

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

《梦幻之星 新星》巨兽联机战及系统操作详细解说

《梦幻之星 新星》巨兽联机战及系统操作详细解说

使用 random_shuffle() 算法随机化序列元素

使用 random_shuffle() 算法随机化序列元素
下拉加载更多内容 ↓