亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

C數值計算程序移植到VC開發環境

2019-11-17 05:42:26
字體:
來源:轉載
供稿:網友

胡金山,史亞鋒

(空軍工程大學工程學院一系飛機教研室 西安710038)

如需轉載請與作者聯系

摘 要:針對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++開發環境下使用。

三. 基于C++語言分析和改換

由于C語言本身的弱點,程序集還存在的缺陷主要有

1.異常處理機制支持較弱;

2.程序沒有對數組下標是否越界的檢測。

假如編程人員對C/C++語言很生疏,并且不熟悉該程序集,那么有可能由于編碼的失誤在調試過程中得到不可預知的荒謬結果。我們的解決方案是為程序集增加C++的異常處理機制,以及用類封裝技術,對數組進行面向對象的封裝和使用,用Array模板類對象替換一維數組,用Matrix模板類對象替換二維數組。下面給出兩個類的聲明部分,它們分別實現最基本的數組和矩陣數據結構和算法。

template <class T=double>

class TArray

{

protected:

T* pdata;

unsigned int length;

public:

TArray();

TArray(unsigned int);

TArray(TArray const&);

virtual ~TArray();

void Operator = (TArray&);

TArray<T>& operator + (TArray&);

TArray<T>& operator - (TArray&);

T const& operator [] (unsigned int)const;

T& operator [](unsigned int);

T const* GetData() const;

unsigned int GetLenght();

void SetLength(unsigned int,bool=true);

};

template <class T=double>

class TMatrix

{

protected:

unsigned int numberOfRows;

unsigned int numberOfColumns;

TArray<T> array;

public:

class Row

{

       TMatrix<T>& matrix;

       unsigned int const row;

public:

Row (TMatrix<T>& _matrix,unsigned int _row):matrix(_matrix),row(_row){}

T& operator [](unsigned int column)const

{return matrix.Select(row,column);}

};



TMatrix();

TMatrix(unsigned int, unsigned int);

TMatrix(TMatrix<T>& mat);

virtual ~TMatrix();



T& Select(unsigned int, unsigned int);

Row & operator[](unsigned int);

TMatrix<T>& operator + (TMatrix<T>& mat);

TMatrix<T>& operator - (TMatrix<T>& mat);

TMatrix<T>& operator * (TMatrix<T>& mat);

bool operator == (TMatrix<T>& mat);

TArray<T>& GetData();

unsigned int GetNumberOfRows();

unsigned int GetNumberOfColumns();

bool LoadFromArray(T [],unsigned int,unsigned int);

bool LoadFromString(char*,char,char);

bool ResetMatrix(unsigned int, unsigned int);

bool ReverseMatrix();

void ZeroMatrix();

void RandomMatrix(int max);

};

舉例說明我們關于異常機制和數組越界的檢測方法的思路。TMatrix類的operator[]返回一個嵌套類Row的引用,它用來描述某一給定二維數組的一個特定行。Row類的operator[]則返回該行一個特定位置的T類型值。最終實現還是通過Matrix<T>::Select()函數,該函數體代碼如下:

template <class T>

T& TMatrix<T>::Select(unsigned int i, unsigned int j)

{            

char ch[50];

if(i>=numberOfRows)

sprintf(ch," Error -- Invalid row: %d",i), throw (ch);

if(j>=numberOfColumns)

sprintf(ch," Error -- Invalid colum: %d",

j), throw (ch);

return array[i*numberOfColumns+j];

}

應用程序實例:

unsigned int i,j;

unsigned int m=2,n=3;

TMatrix< > mat(m,n);//雙精度型矩陣

try

{

for(i=0; i<m; i++)

{

for(j=0; j<n+1; j++)// Line3

cout<<mat[i][j]<<"/t";

cout<<endl;

}

}

catch(char* str)     //捕捉異常

{cout<<str<<endl;}

終端輸出如下(注:類實例mat沒有初始化):

-6.27744e+066   -6.27744e+066   -6.27744e+066   Error -- Invalid colum: 3

只輸出一行,根據出錯提示,把Line3改為:“for(j=0; j<n; j++)”,重新編譯運行,輸出2行3列的正確結果:

-6.27744e+066   -6.27744e+066   -6.27744e+066

-6.27744e+066   -6.27744e+066   -6.27744e+066

由于我們對operator[]進行了重載,所以數組模板類(矩陣模板類)完全兼容C/C++一維數組(二維數組)的存取操作,因此舊程序中數組變量直接可以用類實例變量替代。

上邊給出的數組和矩陣模板類簡潔高效,易于使用,并且也有較好的靈活性。但是,標準C++中提供了為數值計算優化過的valarray模板類取代數組操作,請參閱文獻[3],在Numerics這一章中,探討了valarray,slice等技術,并給出一個在此基礎上Matrix類的實現。建議熟練的C++程序員把握這些更為權威、高級的技術。筆者已經在所附的程序集里包含了一個實現,可能有Bug哦,呵呵!

圖1是我們用Visual C++ 6開發的演示程序界面,左邊是所有算法的目錄樹,右邊是文本計算結果輸出,下部懸浮窗口是算法程序源代碼,可以拷貝粘貼,稍作修改即可重用。



圖1

四. 結論

新的程序與原程序相比較的優點

1. 遵從ISO C/C++標準,因此具有良好的可移植性。可以在大多數流行的C++開發環境下使用;

2. 利用一些技巧,改進了原程序不利于擴展和缺少靈活性的缺點;

3. 去除了原程序中幾個影響效率的Bug;

4. 增加異常處理機制和數組越界檢測,增強可調試性和健壯性;

5. 數組和矩陣操作得到了強有力的支持。

經過我們實際應用測試,新的程序集可以滿足一般工程應用的數值計算需要,并且能夠在原來的基礎上,方便地進行必要的改進和擴充。

(參考文獻)

1.徐士良. C常用算法程序集[M]. 清華大學出版社, 1996.11

2.譚浩強. C程序設計[M]. 清華大學出版社,1998

3.Bjarne Stroustrup. The C++ Programming Language: Special Edition[M]. A Pearson EdUCation Inc.

4.Stephen Prata. C++ Primer[M],2001.10

5.Microsoft Corporation July 2000 release of the MSDN Library

6.Brent Rector, Chris Sells. ATL Internals[M]. Addison Wesley Longman,Inc.


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人激情视频在线播放| 亚洲日韩中文字幕在线播放| 亚洲第一福利在线观看| 国产91色在线播放| 亚洲欧美三级伦理| 性欧美办公室18xxxxhd| 亚洲一区二区三区sesese| 久久91亚洲精品中文字幕| 色偷偷88888欧美精品久久久| 视频直播国产精品| 国产精品福利网| 欧美高清视频免费观看| 欧美丰满少妇xxxx| 日韩美女写真福利在线观看| 97香蕉超级碰碰久久免费的优势| 欧美放荡办公室videos4k| 中文字幕亚洲欧美在线| 日本一区二区三区在线播放| 亚洲乱码一区av黑人高潮| 91天堂在线视频| 69视频在线播放| 日韩福利伦理影院免费| 亚洲一区美女视频在线观看免费| 国产在线观看一区二区三区| 亚洲肉体裸体xxxx137| 91色精品视频在线| 欧美日韩在线视频一区二区| 狠狠做深爱婷婷久久综合一区| 91欧美精品成人综合在线观看| 高清欧美性猛交xxxx黑人猛交| 亚洲性生活视频在线观看| 亚洲va欧美va国产综合剧情| 国产999在线观看| 久久精品小视频| 亚洲美女性生活视频| 成人妇女免费播放久久久| 午夜精品久久久99热福利| 欧美亚洲国产视频| 久久精品国产成人精品| 一区二区三区日韩在线| 亚洲精品中文字幕有码专区| 亚洲精品乱码久久久久久按摩观| 久久精品成人欧美大片古装| 91成人性视频| 精品久久久久久中文字幕大豆网| 国产精品视频男人的天堂| 深夜福利91大全| 红桃av永久久久| 成人激情在线观看| 91久久精品日日躁夜夜躁国产| 91亚洲国产成人久久精品网站| 国产综合在线视频| 日韩精品中文字幕在线| www.欧美精品| 日韩在线视频免费观看高清中文| 日本精品一区二区三区在线| 九九九热精品免费视频观看网站| 久久成人免费视频| 久久精品国产久精国产一老狼| 欧美国产精品人人做人人爱| 欧美日韩在线观看视频| 这里只有视频精品| 国产精品永久免费视频| 亚洲高清在线观看| 国产精品自产拍在线观看中文| 国产成人精品久久二区二区| 国产成人亚洲综合91精品| 亚洲欧美日韩爽爽影院| 欧美大片在线看| 久操成人在线视频| 日韩在线观看网址| 久久精品国产一区二区三区| 日韩人在线观看| 欧美色视频日本高清在线观看| 欧美极品在线视频| 国产免费一区二区三区香蕉精| 欧美在线视频观看| 日韩欧美中文在线| 欧美亚洲视频在线观看| 另类专区欧美制服同性| 国产极品jizzhd欧美| 奇门遁甲1982国语版免费观看高清| 久久久久久久久久久av| 中文字幕av一区| 国产色婷婷国产综合在线理论片a| 成人黄色免费在线观看| 中文字幕亚洲欧美一区二区三区| 97精品国产97久久久久久免费| 久久久免费精品视频| 激情成人在线视频| 欧美精品videosex牲欧美| 欧美亚洲一级片| 中文字幕日韩专区| 黄色精品一区二区| 亚洲色图校园春色| 国产精品永久在线| 欧美视频中文字幕在线| 国产乱人伦真实精品视频| 久久精品国产综合| 国产精品专区一| 亚洲字幕在线观看| 亚洲娇小xxxx欧美娇小| 成人黄在线观看| 亚洲天堂男人天堂女人天堂| 国产香蕉97碰碰久久人人| 欧美精品做受xxx性少妇| 国产精品久久久久久亚洲影视| 国产精品www网站| 热99久久精品| 色综合影院在线| 日韩精品免费一线在线观看| 国产日韩专区在线| 在线精品国产成人综合| 国产女人精品视频| 亚洲欧美日韩一区二区在线| 久久国产精品久久国产精品| 97久久精品人人澡人人爽缅北| 国产亚洲成av人片在线观看桃| 欧美日韩国产精品专区| 色综合老司机第九色激情| 亚洲国产高清福利视频| 欧美激情亚洲综合一区| 久久99久久99精品免观看粉嫩| 日韩av在线资源| 日韩成人在线电影网| 久久在线免费视频| 亚洲欧美在线免费观看| 日韩免费黄色av| 亚洲免费成人av电影| 亚洲精品福利在线| 国产成人精品在线| 亚洲乱码国产乱码精品精| 欧美午夜精品久久久久久人妖| 日韩电影免费观看在线| 亚洲综合中文字幕68页| 国产91精品高潮白浆喷水| 久久久国产精品视频| 81精品国产乱码久久久久久| 伊人久久大香线蕉av一区二区| 亚洲精品日韩丝袜精品| 亚洲国产精品系列| 中文字幕一区二区精品| 2020久久国产精品| 亚洲欧美精品一区| 国产精品一区二区久久久| 中文字幕久热精品在线视频| 久久免费视频观看| 亚洲a级在线播放观看| 亚洲人成电影在线| 欧美激情奇米色| 国产男人精品视频| 欧美日韩国产一中文字不卡| 在线日韩中文字幕| 欧美激情网友自拍| 日韩一中文字幕| 日韩中文字幕国产| 17婷婷久久www| 性欧美暴力猛交69hd| 国产精品扒开腿做爽爽爽男男| 亚洲自拍偷拍一区| 国产视频观看一区| 欧美第一淫aaasss性| 国产一区二区成人| 日韩高清a**址|