国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于VC++6.0平臺(tái)的C程序編譯問題及其解決策略

2013-12-29 00:00:00侯小剛趙晟軒趙華
電腦知識(shí)與技術(shù) 2013年4期

摘要:目前大多數(shù)C語言的編譯系統(tǒng)都是集成環(huán)境,而VC++6.0是最常用運(yùn)行平臺(tái)。為了提高學(xué)生在VC++6.0平臺(tái)下完成C語言編程能力,論文首先對(duì)文獻(xiàn)[1]進(jìn)行分析,指出其對(duì)隱形問題的錯(cuò)誤分析,然后給出正確的解釋和修改案例。其次通過案例給出顯性問題和隱性問題的調(diào)試和編譯方法。最后指出編譯C語言源程序的問題及應(yīng)用策略,從而提高學(xué)生編程能力。

關(guān)鍵詞:顯性問題;隱性問題;編譯方法; VC++6.0;解決策略

中圖分類號(hào):TP312 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2013)04-0773-03

C Program Compilation Problems and Solving Strategy Based on VC++ 6.0 Platform

HOU Xiao-gang1, ZHAO Sheng-xuan2 , ZHAO Hua3

(1. Institute of Geographic Science and Tourism,Xinjiang Normal University,Urumqi 830054,China;2. Digital Culture and New Media Technology Research Center Century College,Beijing 102613,China;3. College of Computer Science and Engineering,Xinjiang Normal University,Urumqi, 830054,China)

Abstract:In order to improve the students ability of completing C language programming on VC++ 6.0 platform, this paper points out the error analysis of implicit problem and gives the correct interpretation based on the analyzing of references[1]. Then the debugging and compilation method on implicit and explicit problems are provided by establishing the examples. Finally, the strategies of compiling C language source code are presented to improve the students' programming ability.

Key words: dominant problem; recessive problems; compiled methods; VC++6.0; coping strategy

1 概述

C語言是一種常用計(jì)算機(jī)程序設(shè)計(jì)語言,它不僅具有編程的靈活性而且還具有很強(qiáng)的數(shù)據(jù)處理能力,不僅在軟件開發(fā)上,還在各類科研都需要用到C語言[2],它不僅可以編寫系統(tǒng)軟件,甚至可以開發(fā)出三維、二維圖形和動(dòng)畫,因此深受計(jì)算機(jī)專業(yè)工作者和計(jì)算機(jī)應(yīng)用開發(fā)人員的喜愛[3]。但是C語言也存在缺點(diǎn),主要表現(xiàn)在:首先對(duì)數(shù)據(jù)的封裝性不做要求,這一點(diǎn)使得C在數(shù)據(jù)的安全性上有很大缺陷(這也是C和C++的一大區(qū)別)。其次C語言的語法限制不太嚴(yán)格[4]。再次對(duì)變量的類型約束不嚴(yán)格,從而影響程序的安全性。最后對(duì)數(shù)組下標(biāo)越界不作檢查等[5]。目前比較優(yōu)秀的C語言編譯平臺(tái)是Microsoft公司推出的一款Visual C++6.0編譯器, 它不僅是一個(gè)C++ 編譯器,而且是一個(gè)基于Windows操作系統(tǒng)的可視化集成開發(fā)環(huán)境(integrated development environment,IDE)[6]。它由許多組件組成:包括編輯器、調(diào)試器以及程序向?qū)ppWizard、類向?qū)lass Wizard等開發(fā)工具[3]。該文的目的是為了幫助學(xué)生在VC++6.0平臺(tái)下完成用C語言的編程,該文分析文獻(xiàn)[1],指出了其中對(duì)隱形問題分析不當(dāng)之處以及所引案例的不妥之處,并進(jìn)行錯(cuò)誤改進(jìn),最后基于顯性和隱性兩類問題提出正確調(diào)試和編譯方法,并通過案例分析介紹C程序的編譯過程。

2 基于VC++6.0的C程序編譯問題分析及其應(yīng)對(duì)策略

文獻(xiàn)[1]分析了幾種C語言編程中經(jīng)常出現(xiàn)“顯性”與“隱性”問題,并通過案例展示討論。

#include

void main()

{

char bz,oper;

int data1,data2,t;

printf("********* 微型計(jì)算器 *********\n");

printf("*********** 運(yùn)算符: '+' '-' '*' '/' ***********\n");

printf("\n");

while(bz!='N'&&bz!='n')

{

printf("請(qǐng)輸入運(yùn)算符:\n");

scanf("%c",&oper);

printf("請(qǐng)輸入data1:\n");

scanf("%d",&data1);

printf("請(qǐng)輸入data2:\n");

scanf("%d",&data2);

switch(oper)

{

case '+':printf("%d+%d=%d\n",data1,data2,t=data1+data2);break;

case '-':printf("%d-%d=%d\n",data1,data2,t=data1-data2);break;

case '*':printf("%d*%d=%d\n",data1,data2,t=data1*data2);break;

case '/':printf("%d/%d=%d\n",data1,data2,t=data1/data2);break;

default:printf("輸入的運(yùn)算符無效?。躰");

}

printf("是否計(jì)算?(輸入N/n退出)\n");

scanf("%c",&bz); //此語句無效

}

}

針對(duì)文獻(xiàn)[1]對(duì)上述案例的分析,發(fā)現(xiàn)有如下不妥之處:第一,本案例錯(cuò)誤之處是對(duì)變量bz沒有賦初值,使得變量的內(nèi)容是一個(gè)隨機(jī)值,這就給程序運(yùn)行帶來了隱患,使程序也許不會(huì)進(jìn)入循環(huán),這是一個(gè)“隱性問題”,文獻(xiàn)[1]對(duì)此沒有進(jìn)行分析。在C語言中變量一定要先定義,后引用,在本案例中要對(duì)bz賦初值。第二,本案例是用2個(gè)scanf()函數(shù)接收兩個(gè)整型的操作數(shù)的輸入,用一個(gè)scanf()接收一個(gè)字符型的程序結(jié)束標(biāo)志的輸入,本意是想對(duì)bz賦值從而控制循環(huán),系統(tǒng)卻把第二個(gè)操作數(shù)結(jié)束輸入標(biāo)志(如空格、回車、tab)當(dāng)做有意義字符通過scanf(“%c”,&bz)語句直接賦給變量bz,從而導(dǎo)致表面上的scanf(“%c”,&bz)語句失效,這又是一個(gè)“隱性問題”。在C語言中整型數(shù)據(jù)與字符型數(shù)據(jù)混合輸入時(shí)要注意輸入方式,一定要清楚其中的運(yùn)行規(guī)則,在本例中要在scanf(“%c”,&bz)語句前加入getchar()語句接收操作數(shù)結(jié)束標(biāo)志,而文獻(xiàn)[1]所分析是緩沖區(qū)造成的,與實(shí)際不符。

3 C語言編程中常見錯(cuò)誤

3.1 “顯性”問題

C語言中“顯性”問題是語法錯(cuò)誤[3],“顯性”問題VC++ 6.0編譯器可以自動(dòng)幫學(xué)生識(shí)別出來了。例如:1)語句結(jié)束標(biāo)志的分號(hào),該用結(jié)束標(biāo)志的時(shí)候忘記添加,而在不需要的地方添加;2)函數(shù)體、復(fù)合語句等前后缺少花括號(hào);3)switch語句中選項(xiàng)后忘記加break跳出命令;4)數(shù)組長度使用變量;5)忽略大小寫區(qū)eARThObF4kjlPa018Br1uY4mSRlcFpSGUpY6bEMYTmE=分,導(dǎo)致顯示變量未定義等。為了避免與解決“顯性”問題的出現(xiàn),學(xué)生要做到如下兩點(diǎn):1)養(yǎng)成良好的書寫習(xí)慣,如:輸入花括號(hào)時(shí)成對(duì)輸入、注意程序的縮進(jìn)格式、一個(gè)語句一行等;2)根據(jù)VC++6.0的報(bào)錯(cuò)功能逐個(gè)找個(gè)錯(cuò)誤原因修改(雙擊可指出錯(cuò)誤點(diǎn))。

3.2 “隱性”問題的應(yīng)對(duì)策略

C語言中的“隱性”問題是邏輯錯(cuò)誤[3],“隱性”問題VC++ 6.0編譯器是無法識(shí)別出來的,只有靠學(xué)生對(duì)C語言基本知識(shí)的牢固掌握以及在編程中養(yǎng)成良好的習(xí)慣,才有可能減少C語言編程中的“隱性”問題。C語言中,邏輯錯(cuò)誤比較復(fù)雜,不易察覺,具有隱蔽性、復(fù)雜性和致命性[7]。C語言的“隱性”問題歸納起來分為以下幾類:1)數(shù)據(jù)之間顯隱性轉(zhuǎn)換的問題。如下代碼圖1與程序運(yùn)行結(jié)果圖2。語句1中1/2.0本身得出了正確的結(jié)果0.5,但是0.5賦值給一個(gè)整形變量后就會(huì)丟掉小數(shù)點(diǎn)。語句3與語句4中1/2本身是想得到結(jié)果0.5,但是學(xué)生忘記了算術(shù)運(yùn)算符“/”是取整運(yùn)算。語句2才得出了正確的結(jié)果。

2)局部變量初始化默認(rèn)值是隨機(jī)值。在C語言編程中,經(jīng)常出現(xiàn)忘記對(duì)變量的賦初值,從而出現(xiàn)異常的運(yùn)算結(jié)果。如下程序圖1與結(jié)果圖2,本應(yīng)該輸出的sum的值是45,add的是362880,但本程序輸出的值顯然是隨機(jī)值,要想輸出正確的結(jié)果,必須給sum與add分別賦初值0和1。

4)指針引用錯(cuò)誤。指針式C語言的精華所在,也是難點(diǎn)所在,學(xué)生在這個(gè)知識(shí)點(diǎn)上所錯(cuò)誤最多,而且錯(cuò)誤也不易找到與修改,而有些隱藏較深的錯(cuò)誤即使對(duì)于熟練的程序員來說也很難發(fā)現(xiàn)與排除。因此在學(xué)習(xí)C語言時(shí),正確理解和使用指針是非常重要的。以下通過幾個(gè)案例說明指針編程中幾個(gè)常見問題及糾正方法:①使用未初始化的指針。如圖5代碼與圖6結(jié)果,指針p在聲明時(shí)未初始化,指向的是一個(gè)隨機(jī)內(nèi)存地址。它可能指向系數(shù)棧、全局變量或操作系數(shù)。當(dāng)執(zhí)行*p=12時(shí),程序不加辨別的在p所指向的隨機(jī)位置處寫入一個(gè)12。這時(shí)程序可能立即崩潰(如圖6),也可能等半小時(shí)然后崩潰,或者程序另一個(gè)部分?jǐn)?shù)據(jù)隨機(jī)破壞而用戶毫無察覺??梢娺@種錯(cuò)誤非常難查找,所以在使用指針之前一定要為指針變量初始化有效地址。

②無效指針引用。當(dāng)指向無效地址的指針仍被引用時(shí)即發(fā)生無效指針引用,導(dǎo)致這類錯(cuò)誤的一種可能是當(dāng)q未初始化時(shí)執(zhí)行p=q;。此時(shí)指針p也變?yōu)槲闯跏蓟摹H魏螌?duì)*p的引用即造成無效指針引用。避免此類錯(cuò)誤的惟一途徑是用畫圖的方法記錄每個(gè)步驟的指針引用情況,并確保全部指針都各有所指。由于和①同樣的錯(cuò)誤原因,無效指針引用也會(huì)導(dǎo)致程序莫名其妙地崩潰。③零指針引用。當(dāng)試圖在程序中引用指向零地址的指針時(shí)即發(fā)生零指針引用。例如圖7 p=0;是一個(gè)無效指針,不指向任何內(nèi)存塊。所以試圖對(duì)此內(nèi)存塊的讀寫即為無效的零指針引用結(jié)果如圖8。將指針指向零地址是有充分的正當(dāng)理由的,然而對(duì)零指針的引用(取出指針指向的地址中的內(nèi)容)卻是無效的。為了避免這類錯(cuò)誤的出現(xiàn),最好的方法是為程序的每一步畫圖記錄指針引用情況。

此外,數(shù)組定義與引用的錯(cuò)誤。在C語言中,對(duì)數(shù)組定義的理解雖然看似簡單,但定義數(shù)組時(shí)下標(biāo)類型出錯(cuò),數(shù)組名作地址時(shí)理解出錯(cuò),多維數(shù)組中數(shù)組元素的表示形式出錯(cuò)。

4 結(jié)論

在編譯調(diào)試過程中,應(yīng)熟悉C語言的語法結(jié)構(gòu),熟練掌握各種結(jié)構(gòu)的用法,在良好的編程習(xí)慣下借助VC++6.0的調(diào)試功能即可解決“顯性”問題。語法錯(cuò)誤在經(jīng)過大量練習(xí)的“洗禮”過后,已經(jīng)微不足道,學(xué)生都可以輕松解決,以后更加困惑學(xué)生的將是隱性問題,邏輯上的錯(cuò)誤VC++6.0不能指出,只能是學(xué)生在熟悉各種結(jié)構(gòu)和算法,清晰掌握其中原理的基礎(chǔ)上,逐個(gè)實(shí)現(xiàn)程序功能,逐一排錯(cuò)。

參考文獻(xiàn):

[1] 胡敬朋.基于VC++ 6.0的C程序編譯問題分析及其應(yīng)對(duì)策略[J].電腦知識(shí)與技術(shù),2011,7(19):4584-4585.

[2] 李必信.一種分析和理解程序的方法——程序切片[J].計(jì)算機(jī)研究與發(fā)展,2000,37(3):284-291.

[3] Weiser M.Programmers Use Slices When Debugging[J] .Communications of the ACM,1982,25(7):446-452.

[4] Zhang Xiangyu,He Haifeng.Experimental Evaluation of Using Dynamic Slices for Fault Location[C]//California,USA:Proc.of the 6th International Symposium on Automated and Analysis-driven Debugging.2005.

[5] Sun Jirong,Li Zhshu,Ni Jianchen,etal.Software Fault Localization Based on Testing Requirement and Program Slice[C]// Guilin,China :Proc.of International Conference on Networking,Architecture and Storage,2007.

[6] 李曉玫,楊小平.Excel中的VBA程序設(shè)計(jì)[J].四川師范大學(xué)學(xué)報(bào):自然科學(xué)版,2004,2004(4):423-426.

[7] 王林章,李宣東,鄭國梁.模型驅(qū)動(dòng)的軟件測(cè)試研究[J].計(jì)算機(jī)科學(xué),2005,32(10):230-235.

达拉特旗| 商洛市| 蓝田县| 平泉县| 高清| 华宁县| 沈丘县| 新野县| 龙海市| 临江市| 拜城县| 呈贡县| 伊川县| 辛集市| 丰都县| 留坝县| 柳河县| 政和县| 广州市| 石柱| 浙江省| 舞钢市| 东港市| 阿图什市| 扎鲁特旗| 恩施市| 绥中县| 西安市| 乳源| 纳雍县| 荆门市| 建德市| 永宁县| 通许县| 白山市| 巨野县| 武邑县| 鹰潭市| 南召县| 获嘉县| 湖口县|