2024年6月6日发(作者:)

电脑编程技巧与维护 

TC和VC编译器下典型“不兼容" 

C程序分析 

苑丽红,孙爽滋 

(长春理工大学计算机学院,长春130022) 

摘要:TC和VC是两种常见的C程序编译器。但有时相同的C源程序代码在TC和VC环境下却可能产生不同的 

运行结果。文中讨论了几类典型不“兼容”的c程序案例,如特殊字符输出、结构类型内存分配等,给出了程序在 

不同编译器下的运行情况,并分析其原因。 

关键词:C程序;编译器;TC;VC 

Discussion of Typical“Incompatible"C Programming on TC and VC 

YUAN Li-hong,SUN Shuang-zi 

(Computer college,Changchun university of Science and Technology,Changchun 130022,China) 

Abstract:Both TC and VC are common C program compiler.But sometimes the same source C code may get diferent re— 

suit when run under TC and VC environment.This paper discusses typical“incompatible”C programming examples,in— 

cluding the put of special character sequences and the variable size of struct,gives the output of them under different tom— 

piler,and analyzes the reason. 

Key words:C program;compiler;TC;VC 

TC(TurboC2.0)和VC(Microsoft Visual C++6.0)是调试 

maln 0 

{float a【3】【2]; 

C语言程序的典型编译器。然而,并不是任何程序在TC和 

VC下都有相同的运行结果,这不免给从TC转向VC的编程者 

带来困扰。笔者从实践中总结出几类典型“不兼容”的C程 

序,供学习C语言的读者参考。 

inti’j; 

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

fro O--Oj<2 ̄++) 

scanf C%fl’,&a[i]【j】); 

pfinff C%f’,a【l】【11); 

}_+ 

TC下运行,显示: 

scanf:lfoating point formats not linked 

l int型数据溢出问题 

main 0 

{int a=32767+1; 

prinff C%d.t,a1; 

l 

Abnormal program termination。而VC下正常。 

TC下运行结果:一32768。VC下运行结果:32768。 

事实上,TC编译器对float型二维数组,并没有自动链接 

浮点库格式,因而scanf函数出错。解决的方法是用是scanf之 

分析:TC下int型数据分配两个字节,int型的表数范围 

小(一32768到32767),出现溢出错。VC下int型数据占4个 

字节,表数范围一2147483648到2147483647,此例自然正常。 

前,另定义一普通float型变量。而VC环境不存在这个问题。 

4 自加运算连用问题 

main 0 

{int a=5; 

2\tkb连用的问题 

main 0 

{char chl=,A ,ch2="13 ; 

prinff C abcdefghha”,chl,ch2); 

prinff C C ̄t\b%c%c”,chl,ch2); 

}-+ 

prinff(”%d”,(a++)+(a++)+(a++)); 

prinff(”,%d..,a); 

{一 

TC下运行,结果:18,8。而VC下运行:结果:15,8。 

结果迥异的原因:当连续自加表达式出现在prinff函数的 

参数位置,TC会自左向右边求各(a++)的值边进行加法运 

C AB 

TC下运行结果:abcdefg 

VC下运行结果abcdefgh 

CAB 

算,故计算的是5+6+7。而VC中,连续自加都是先取a的原 

值运算,再统一自加上相应次数,即计算的是5+5+5,然后a 

各自独 

自加3。 (下转到35页) 

分析:当转义字符\t和\b连用之时,TC下 

立,保持本义。(即\t:光标跳到下一输出区,\b:光标退一 

格)。故此例在TC下运行字母A会在第8列,而VC编译器 

下,\b会解释成:退回到\t发生之前的所在列。 

作者简介:苑丽红(1974一),女,副教授,研究方向:智能 

算法、模式识别;孙爽滋,副教授;杨勇,教授。 

收稿日期:2012—08—18 

3 float非法中断问题 

。 20螨12. 20 

S0FTWARE DEVEL0PMENT AND DESIGN 

can

can

软件开发与设计 

片进行交互,而是通过can

rec函数获得CAN数据,然后返 

send 0; 

rec 0; 

main 0 

回给用户程序。can_ree函数能够直接从MCP2510芯片中的接 

收寄存器中读取相应的CAN数据包,从中解析出原始数据后 

返回给rec—data函数。 

主循环 / 

{ 

sys_init 0; 

while(1) 

{ 

send

_

delay函数的功能是控制整个程序收发CAN数据的频率, 

具体的参数可以根据用户的需求自由改动。 

用户在上述软件框架的基础上,可以非常方便的设置相 

关硬件的初始化参数以及函数的应用功能,使得整个系统能 

够适应实际需要进行调试的CAN总线通信环境,以保证调试 

结果的真确性和实用性。 

data 0 

{ 

can

send 0 

} 

rec

data 0 

5结语 

提出了一种基于Arduino的CAN总线实验平台的设计方 

{ 

can

案。该平台借助Arduino开放的软硬件解决方案以及友好的硬 

._

rec 0; 

) 

件控制函数库,高效的实现了CAN总线的调试功能。因此该 

延时 / delay 0; 

} 

} 

平台能够有效降低CAN总线调试终端的设计成本和应用难度。 

文中设计的基于Arduino的CAN总线实验平台分别在通 

信速率为1MBs、500KBs和125MBs的CAN总线台架上进行 

了实验,结果表明该平台完全能够满足高效进行CAN总线调 

试的功能。 

sys_init函数的任务是依次调用各个初始化子函数,完成 

对Arduino电路板和CAN总线节点的初始化工作。其中,A卜 

duino系统初始化工作主要包括处理器时钟频率初始化、中断 

初始化、定时器初始化、看门狗初始化和SPI接口初始化等。 

CAN总线节点的初始化工作基本上就是CAN总线控制器 

MCP2510芯片的初始化工作。 

send

此外,文中也对Arduino平台在现场总线调试领域的应用 

做出了积极的探索和尝试。 

参考文献 

【1】纪欣然.基于Arduino开发环境的智能寻光小车设计[J]. 

现代电子技术,2012. 

【2]蔡睿妍.基于Arduino的舵机控制系统设计[JJ.电脑知识 

与技术,2012. 

data函数的功能是实现CAN数据的发送。由于本系 

统是通过SPI接口来控制CAN总线节点。所以为了降低函数 

本身的复杂性,send—data函数的主要功能仅仅是向用户提供 

需要向CAN总线发送的原始数据,然后把该原始数据传递给 

CAN总线控制器MCP2510芯片的控制函数can_send。 

can send函数能够根据用户设定的参数生成相应的CAN数据 

包数据,并驱动MCP25 10芯片实现CAN数据包的发送。 

rec

[3】袁本华,董铮.基于Arduino控制板的温室大棚测温系统 

设计【JJ.安徽农业科学,2012. 

[4】张晓焱,吴士力,朱兰.CAN总线嵌入式Linux汽车行驶 

data函数的功能是实现从CAN总线上接收CAN数 

.・●・-.・●_--._●--.‘__●-・.‘-●●‘‘-.・●●●・-.・●●●・_.・●●●・..‘●●●-..・●-●_..-'●●..--●●_-.-._●_--.._●_.-_・●・..・●-.._●_._’●●..●●●‘●.●●●。●-.●●●‘●-.●-I●・..・●●●-…●●●・_.・●●●・..-'●●-_, 

记录仪的设计fJ1.电脑编程技巧与维护,2010. 

据。send_data函数类似,rec_data函数并直接和MCP2510芯 

._

●・-.・●・-…・●・.-’●・.

(上接第16页) 

5 结构体变量内存分配的问题 

main 0 

{struet stu 

{lfoat num; 

char sex; 

4,为1(char型的大小)的4倍,为sex分配一个字节后, 

成员score的偏移量就应该是5,但由于5并不是4(lfoat型 

的大小)的倍数,所以其实要继续填充3个字节,使其偏移量 

为8。最终即4+4+4。 

明白了以上的区别,在转换环境调试C程序时,就能处 

变不惊。 

lfoat score;}s; 

printf(”%d'.,sizeof(s)); 

} 

参考文献 

[1】谭浩强.C程序设计.第3版.北京:清华大学出版社, 

2008. 

TC运行:结果:9。VC运行:结果12。 

对结构体变量的内存分配,TC简单的分配各个成员所需 

内存之和。本例即4+1+4。而VC则规定:各成员变量存放的 

起始地址相对于结构起始地址的偏移量必须为该变量类型所 

【2】Brian W.Kernighan,Dennis M.Ritchie.C Programming Lan— 

guage(2nd Edition).【M】.机械工业出版社,2004. 

占字节数的倍数,且结构体的总大小为其最宽基本类型成员 

大小的整数倍。此例中,成员sex相对于结构体的偏移量为 

【3】C语言大学实用教程.第2版.北京:电子工业出版社, 

2008 

妊-_茹